C#使用Unity框架

来源:互联网 发布:网络借贷监管法学 编辑:程序博客网 时间:2024/06/08 01:24

转载自:C#使用Unity框架


        上次我总结了.net常用的三个工具:dapper、postsharp、nuget。dapper是开源小工具,执行sql语句封装返回来数据十分方便。postsharp是AOP,即 Aspect-oriented programming(面向横切面编程)。这个主要是为了减少写日志的麻烦。否则每个函数内写日志还是挺麻烦的事情。nuget是C#管理库文件的小工具。其实在C#开发大型工程时,如需开发多个数据库版本时,如果仅使用配置文件则比较麻烦,本文介绍的Unity 框架可以根据配置文件注册相关的接口和实现类,在程序中直接取用即可。当然了开发多数据库版本还有很多方法,目测我之后会介绍利用抽象类来实现的多数据库版本工程。


        下面就是转载自大神的总结:

         

Unity 应用程序块(Unity)是一个轻量级、可扩展的依赖注入容器,支持构造函数、属性和方法调用注入。

1.控制反转 (IoC)模式,这是一种设计模式,它描述了用于支持对象可以查找它们需要的其他对象的实例的插件架构的技术。

2.依赖注入 (DI)模式,这是 Ioc 模式的一种特殊情况,是一种基于改变对象的行为而不改变类的内部的接口编程技术。开发人员编写实现接口的类代码,并基于接口或者对象类型使用容器注入依赖的对象实例到类中。用于注入对象实例的技术是接口注入、构造函数注入、属性(设置器)注入和方法调用注入。

Unity 应用程序块使用容器注册类型和映射的两种方法如下:

A:RegisterType。此方法用容器注册一个类型。在适当的时候,容器将构建一个指定的类型的实例。这可以通过类的特性或者调用 Resolve方法时初始化依赖注入。构建的对象的生命周期与在方法参数中指定的生命周期一致。如果没有指定生命周期的值,将为类型注册一个暂时的生命周期,这意味着容器将为每一个对 Resolve的调用创建一个新的实例。

B:RegisterInstance。此方法将一个指定的类型的已存在的实例注册到容器,并带有指定的生命周期。容器将在生命周期内返回已有的实例。如果没有指定生命周期,实例将拥有容器控制的生命周期。下面将介绍注册实例的四种方式

1)类型的配置容器注册

作为 RegisterType Resolve 方法的重载的一个示例,下列代码注册了一个用于接口 IMyService的映射,将指定容器将返回 CustomerService类(实现了IMyService接口)的实例。

IUnityContainermyContainer = new UnityContainer();
myContainer.RegisterType<IMyService, CustomerService>();
IMyService myServiceInstance = myContainer.Resolve<IMyService>();

2)已有对象实例的配置容器注册

做为使用RegisterInstance Resolve 方法重载的一个示例,下列代码注册了实现了 IMyService接口的 LoggingService类的一个已有实例,然后获取此实例:

IUnityContainermyContainer = new UnityContainer();
LoggingService myExistingObject = new LoggingService();
myContainer.RegisterInstance<IMyService>(myExistingObject);
IMyService myServiceInstance = myContainer.Resolve<IMyService>();

3)构造函数注入

做为构造函数注入的一个示例,如果开发人员用 Unity容器的 Resolve方法实例化的类有一个构造函数定义了一个或多个对其他类的依赖,Unity容器将自动创建指定在构造函数参数中的依赖的对象实例。例如,下列代码展示了依赖于 LoggingService对象的 CustomerService类。

public classCustomerService
{
public CustomerService(LoggingService myServiceInstance)
{
// work with the dependent instance
myServiceInstance.WriteToLog("SomeValue");
}
}

在运行时,开发人员使用容器的 Resolve方法创建了 CustomerService类的一个实例,这导致了实例生成框架将具体类 LoggingService的一个实例注入到 CustomerService类中。

IUnityContaineruContainer = new UnityContainer();
CustomerService myInstance = uContainer.Resolve<CustomerService>();

4)属性(设置器)注入

除了前面描述的构造函数注入以外,Unity应用程序块还支持属性和方法调用注入。下列代码示范了属性注入。ProductService类暴露了一个引用另一个名为 SupplierData类(没有定义在下列代码中)的实例的属性。要强制依赖对象的依赖注入,开发人员必须像下列代码中一样使用 Dependency特性装饰属性的声明:

public classProductService
{
private SupplierData supplier;
[Dependency]
public SupplierData SupplierDetails
{
get { return supplier; }
set { supplier = value; }
}
}

0 0