首页 > 代码库 > 微软依赖注入Unity
微软依赖注入Unity
Unity是一个依赖注入(Dependency Injection,DI)容器。DI的标准描述文章来自Martin Flower[0]。作为一个快速的摘要,依赖注入容器就是一个用于构建高度松耦合的软件的工具。依赖注入容器处理相互关 联对象的所有细节,因此你可以构建一个独立的组件
关于依赖注入这是百科的解释:http://baike.baidu.com/view/1800021.htm
这是unity的地址:http://unity.codeplex.com/
下载最新的是2.1版本,http://www.microsoft.com/download/en/details.aspx?id=17866
下载是msi文件,安装后有bin文件夹和源代码和几个实例项目
打开vs,新建项目,添加Microsoft.Practices.Unity.dll的引用,就可以使用依赖注入了
1.准备接口和类
public interface ILog
{
void Write(string message);
}
public class TextFileLogger : ILog
{
public void Write(string message)
{
Console.WriteLine("Text File Write" + message);
}
}
public class DatabaseLogger : ILog
{
public void Write(string message)
{
Console.WriteLine("Database Write" + message);
}
}
通过代码方式进行依赖注入
2.在 static void Main(string[] args)方法中创建容器。
容器可以注册接口和返回接口,是依赖注入的核心。
简单步骤,1创建容器,2注册接口映射,3获取实例
//容器
IUnityContainer parentContainer = new UnityContainer();
//父容器可以创建子容器
//IUnityContainer chileContainer = parentContainer.CreateChildContainer();
//默认对象
parentContainer.RegisterType <ILog, UnityDI.TextFileLogger>();
//给datalogger在容器中起个名字,以后根据名字得到databaselogger
parentContainer.RegisterType<ILog, UnityDI.DatabaseLogger>("database");
//没有参数取默认
ILog textLog = parentContainer.Resolve<ILog>();
textLog.Write("aaaaaaaaaaa");
//根据名字去
ILog dataLog = parentContainer.Resolve<ILog>("database");
dataLog.Write("aaaaaaaaaaa");
//遍历输出已注册的ILogger接口对象,默认参数不会输出
foreach (object mapping in parentContainer.ResolveAll<ILog>())
{
Console.WriteLine(mapping.GetType());
}
根据配置文件方式进入依赖注入
在config文件中的
配置 <configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections>
(注意configSections这个节点必须configuration下的第一个节点)
然后
<unity>
<typeAliases>
<!--三个不同类型的生命周期-->
<typeAlias alias="singleton"
type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
<typeAlias alias="external"
type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity" />
<typeAlias alias="perThread"
type="Microsoft.Practices.Unity.PerThreadLifetimeManager, Microsoft.Practices.Unity" />
<!--给类注册别名,以后直接使用别名就可以代替具体类,type=类的详细命名空间和类名词,然后逗号后面是程序集名词-->
<typeAlias alias="DatabaseLogger" type="ConsoleApplication1.UnityDI.DatabaseLogger, ConsoleApplication1" />
<typeAlias alias="TextFileLogger" type=" ConsoleApplication1.UnityDI.TextFileLogger, ConsoleApplication1" />
<typeAlias alias="ILogger" type=" ConsoleApplication1.UnityDI.ILog, ConsoleApplication1" />
</typeAliases>
<containers>
<container>
<types>
<!--type是接口,mapto是目标实例化对象-->
<type type="ILogger" mapTo="DatabaseLogger" >
<lifetime type="singleton" />
</type>
</types>
</container>
</containers>
</unity>
使用的时候注意添加Microsoft.Practices.Unity.Configuration.dll
然后通过代码这样就可以使用。通过配置文件中mapto的不同,实例化不同的接口对象
IUnityContainer container = new UnityContainer();
UnityConfigurationSection config = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
config.Configure(container);
ILog defaultLogger = container.Resolve<ILog>();
defaultLogger.Write(" hello Unity!");
微软企业库5.0的手册中有关于unity的文档,其他地方好像真找不到
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=6932
关于依赖注入这是百科的解释:http://baike.baidu.com/view/1800021.htm
这是unity的地址:http://unity.codeplex.com/
下载最新的是2.1版本,http://www.microsoft.com/download/en/details.aspx?id=17866
下载是msi文件,安装后有bin文件夹和源代码和几个实例项目
打开vs,新建项目,添加Microsoft.Practices.Unity.dll的引用,就可以使用依赖注入了
1.准备接口和类
public interface ILog
{
void Write(string message);
}
public class TextFileLogger : ILog
{
public void Write(string message)
{
Console.WriteLine("Text File Write" + message);
}
}
public class DatabaseLogger : ILog
{
public void Write(string message)
{
Console.WriteLine("Database Write" + message);
}
}
通过代码方式进行依赖注入
2.在 static void Main(string[] args)方法中创建容器。
容器可以注册接口和返回接口,是依赖注入的核心。
简单步骤,1创建容器,2注册接口映射,3获取实例
//容器
IUnityContainer parentContainer = new UnityContainer();
//父容器可以创建子容器
//IUnityContainer chileContainer = parentContainer.CreateChildContainer();
//默认对象
parentContainer.RegisterType <ILog, UnityDI.TextFileLogger>();
//给datalogger在容器中起个名字,以后根据名字得到databaselogger
parentContainer.RegisterType<ILog, UnityDI.DatabaseLogger>("database");
//没有参数取默认
ILog textLog = parentContainer.Resolve<ILog>();
textLog.Write("aaaaaaaaaaa");
//根据名字去
ILog dataLog = parentContainer.Resolve<ILog>("database");
dataLog.Write("aaaaaaaaaaa");
//遍历输出已注册的ILogger接口对象,默认参数不会输出
foreach (object mapping in parentContainer.ResolveAll<ILog>())
{
Console.WriteLine(mapping.GetType());
}
根据配置文件方式进入依赖注入
在config文件中的
配置 <configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections>
(注意configSections这个节点必须configuration下的第一个节点)
然后
<unity>
<typeAliases>
<!--三个不同类型的生命周期-->
<typeAlias alias="singleton"
type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
<typeAlias alias="external"
type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity" />
<typeAlias alias="perThread"
type="Microsoft.Practices.Unity.PerThreadLifetimeManager, Microsoft.Practices.Unity" />
<!--给类注册别名,以后直接使用别名就可以代替具体类,type=类的详细命名空间和类名词,然后逗号后面是程序集名词-->
<typeAlias alias="DatabaseLogger" type="ConsoleApplication1.UnityDI.DatabaseLogger, ConsoleApplication1" />
<typeAlias alias="TextFileLogger" type=" ConsoleApplication1.UnityDI.TextFileLogger, ConsoleApplication1" />
<typeAlias alias="ILogger" type=" ConsoleApplication1.UnityDI.ILog, ConsoleApplication1" />
</typeAliases>
<containers>
<container>
<types>
<!--type是接口,mapto是目标实例化对象-->
<type type="ILogger" mapTo="DatabaseLogger" >
<lifetime type="singleton" />
</type>
</types>
</container>
</containers>
</unity>
使用的时候注意添加Microsoft.Practices.Unity.Configuration.dll
然后通过代码这样就可以使用。通过配置文件中mapto的不同,实例化不同的接口对象
IUnityContainer container = new UnityContainer();
UnityConfigurationSection config = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
config.Configure(container);
ILog defaultLogger = container.Resolve<ILog>();
defaultLogger.Write(" hello Unity!");
微软企业库5.0的手册中有关于unity的文档,其他地方好像真找不到
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=6932
其他msdn资料http://msdn.microsoft.com/en-us/library/ff660923%28v=PandP.20%29.aspx
本人新浪微博:http://weibo.com/i/1741159542
微软依赖注入Unity
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。