C# Unity使用
1.引用對象
2.在app.config中進行配置
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> </configSections> <unity configSource="unity.config" /> </configuration>
這裡unity的配置是在unity.config中進行配置的。
代碼如下:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <!--alias 定義別名--> <alias alias="IClass" type="ConsoleApplication1.IClass, ConsoleApplication1" /> <alias alias="MyClass" type="ConsoleApplication1.MyClass, ConsoleApplication1" /> <!--引入下面的命名空間,可以省的輸入過多的內容--> <namespace name="ConsoleApplication1" /> <assembly name="ConsoleApplication1" /> <container > <register type="IClass" mapTo="MyClass" /> <register type="ILogger" mapTo="FileLogger"></register> <!--註冊類+構造函數 默認數值是3--> <register type="InstallerBase" mapTo="BlogInstaller"> <constructor> <param name="pubContext" type="IPubContext" /> <param name="sum" type="System.Int32" value="3" /> </constructor> </register> <!--<register type="ISomeInterface[]" mapTo="MyTypeImplementingSomeInterface[]"/>--> <register type="ISomeInterface[System.Int32]" mapTo="MyTypeImplementingSomeInterface[System.Int32]"/> <register type="ObjectWithOverloads" name="callFirstOverload"> <method name="CallMe"> <param name="param" type="int" value="17"/> </method> </register> <register type="ILogger" mapTo="MockLogger" name="validLogger" /> <register type="ObjectUsingLogger" name="dependencyRegistered"> <property name="Logger"> <optional name="validLogger" /> </property> </register> <!--數值--> <register type="ILogger" name="main" mapTo="MockLogger" /> <register type="ILogger" name="another" mapTo="MockLogger" /> <register type="ILogger" name="special" mapTo="SpecialLogger" /> <register type="ArrayDependencyObject" name="specificElements"> <property name="Loggers"> <array> <dependency name="main" /> <dependency name="another" /> </array> </property> </register> </container> </unity>
3.關於配置的說明
<!--alias 定義別名-->
<alias alias="IClass" type="ConsoleApplication1.IClass, ConsoleApplication1" />
<!--引入下面的命名空間,可以省的輸入過多的內容-->
<namespace name="ConsoleApplication1" />
2個操作是為了使輸入簡單。
4.實例說明
4.1 定義UnityContainer,并初始化用配置文件中的數據
var container = new UnityContainer(); UnityConfigurationSection configuration = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); configuration.Configure(container);
4.2 註冊簡單接口類
<register type="IClass" mapTo="MyClass" />
代碼如下:
interface IClass { void ShowInfo(); }
class MyClass:IClass { [Dependency]//實例化對象 public virtual IPubContext Context { set; get; } #region IClass 成員 public void ShowInfo() { Console.WriteLine("MyClass12"); } #endregion }
代碼中調用:
IClass classInfo = container.Resolve<IClass>();
classInfo.ShowInfo();
4.3 如果對象中有屬性,需要初始化,可以在屬性上加[Dependency]//實例化對象,那麼在取得對象的時候,這個屬性頁初始化了。
如上例中的IPubContext 屬性。
class IPubContext
{
public string Name { set; get; }
}
4.4 帶構造函數的實例配置
<register type="InstallerBase" mapTo="BlogInstaller"> <constructor> <param name="pubContext" type="IPubContext" /> <param name="sum" type="System.Int32" value="3" /> </constructor> </register>
定義類型如下:
class BlogInstaller : InstallerBase { private IPubContext pubContext; private int sum; public BlogInstaller(IPubContext pubContext,int sum) { this.pubContext = pubContext; } #region InstallerBase 成員 public void ShowInfo() { Console.WriteLine("FileLogger12InstallerBase"); } #endregion } interface InstallerBase { void ShowInfo(); }
代碼調用如下:
InstallerBase classInstallerBase = container.Resolve<InstallerBase>();
classInstallerBase.ShowInfo();
其中,構造函數是:
public BlogInstaller(IPubContext pubContext,int sum)
{
this.pubContext = pubContext;
}
與配置文件中的參數是一一對應的。並且配置文件中對與sum這個屬性,有默認數值是3.
4.5 泛型類型配置
<register type="ISomeInterface[]" mapTo="MyTypeImplementingSomeInterface[]"/>
代碼如下定義:
public interface ISomeInterface<T> { } public class MyTypeImplementingSomeInterface<T> : ISomeInterface<T> { }
代碼調用如下:
ISomeInterface<int> some = container.Resolve<ISomeInterface<int>>();
4.6 配置方法的執行
<register type="ObjectWithOverloads" name="callFirstOverload"> <method name="CallMe"> <param name="param" type="int" value="17"/> </method> </register>
定義類callFirstOverload,並且定義方法CallMe:
/// <summary> /// 執行方法 /// </summary> class ObjectWithOverloads { public int FirstOverloadCalls; public int SecondOverloadCalls; public void CallMe(int param) { ++FirstOverloadCalls; } public void CallMe(string param) { ++SecondOverloadCalls; } }
代碼調用:
//執行方法 var result = container.Resolve<ObjectWithOverloads>("callFirstOverload"); Console.WriteLine(result.FirstOverloadCalls);
4.7 數組配置
<!--數組--> <register type="ILogger" name="main" mapTo="MockLogger" /> <register type="ILogger" name="another" mapTo="MockLogger" /> <register type="ILogger" name="special" mapTo="SpecialLogger" /> <register type="ArrayDependencyObject" name="specificElements"> <property name="Loggers"> <array> <dependency name="main" /> <dependency name="another" /> </array> </property> </register>
定義類:
class ArrayDependencyObject { public ILogger[] Loggers { get; set; } public string[] Strings { get; set; } } class SpecialLogger : ILogger { #region ILogger 成員 public void ShowInfo() { throw new NotImplementedException(); } #endregion }
代碼調用:
var result2 = container.Resolve<ArrayDependencyObject>("specificElements");
可以看到result2執行完成后,會得到 result2.Loggers數組,這個數組包括2個對象,一個是main
另一個是another,都是ILogger對象。
4.8 LifetimeManager的使用。是定義一個生命週期。這裡就不說了。在我的MVC中,有使用。