通常,你主要使用下列2种方法之一来创建企业库对象实例。
1.使用Unity服务器定位器(Using the Unity Service Locator):这是最简单的方法,如果你的应用只
有少量依赖,并且你不想使用现在的架构模式例如依赖注入,那么推荐使用这种方法。 它不需要初始化和设置。你只需配置你的应用使用企业库,然后调用服务定位器的方法来获取需要类型的企业库实例。
2.直接通过Unity容器。这个比较复杂的方法使你为你的层、组件、自定义类型通过现在架构模式例如依
赖注入获得全部的好处。它只需少量的配置,但需要在应用中保持对容器的引用。
你可以使用的其他方法:
1.如果你决定使用不同于Unity的容器,你可以使用其他服务定位器。
2.在之前的版本中使用传统的静态门面(static facades )和工厂
使用Unity服务器定位器:
创建企业库对象最简单的方法就是通过服务定位器创建需要的对象实例,而不是将他们注入到你的应用对像中。服务定位器实际上就是容器的包装,暴露一系列用来返回基于注册和映射的适当类型实例的方法。通过名称从数据访问模块获得实例
C#
Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("mydatabase");
db.ExecuteNonQuery("DoSomethingInteresting");
Visual Basic
Dim db As Database = EnterpriseLibraryContainer.Current.GetInstance(Of Database)("mydatabase")
db.ExecuteNonQuery("DoSomethingInteresting")
直接访问Unity容器:
基本原则是代替获得你需要的对象,而是接收他们作为输入。一个容器,它基本上是一个用于存储类型注册和
映射和实例化请求类型的机制。当你的应用程序代码的请求(或解决)接口,一个基类,或通过定义一个依赖于该
类型的具体类型时,它被配置为返回一个适当类型的实例。
当使用依赖注入的时候你不需要明确请求实例;相反依赖注入机制决定需要的实例并注入它。依赖注入将你从
必须创建所有依赖对象并将他们传到指定目标中解脱出来。依赖注入容器为你创建对象,确定依赖关系。
如果你接受依赖注入的工作方式,或者你想通过容器来管理其周期,或者创建并修改类型注册和映射,你可以
专门创建一个容器并配置它。这意味着您可以解决您的应用程序中除了企业库对象之外的其他对象,例如用户界面
组件、试图模型、业务对象。
企业库提供EnterpriseLibraryCoreExtension 容器的扩展,可以很方便的用企业库配置信息来初始化和填充默
认的Unity容器。下例实例化一个新的Unity容器并添加扩展,使所有的企业库注册和映射都可用。
C#
var container = new UnityContainer().AddNewExtension<EnterpriseLibraryCoreExtension>();
Visual Basic
Dim container = New UnityContainer().AddNewExtension(Of EnterpriseLibraryCoreExtension)();
依赖注入示例:
通常,当您直接访问容器将受益于依赖注入,你将用它来解决自己的具体类,容器将注入企业库对象以及与所有其他对象和依赖.
下面的例子显示TaxCalculator类型具有两个依赖 ExceptionManager和LogWriter.
C#
public class TaxCalculator
{
private ExceptionManager _exceptionManager;
private LogWriter _logWriter;
public TaxCalculator(ExceptionManager em, LogWriter lw)
{
this._exceptionManager = em;
this._logWriter = lw;
}
}
Visual Basic
Public Class TaxCalculator
Private _exceptionManager As ExceptionManager
Private _logWriter As LogWriter
Public Sub New(em As ExceptionManager, lw As LogWriter)
Me._exceptionManager = em
Me._logWriter = lw
End Sub
End Class
当您有一个容器的引用,你可以用它来解决具体的对象,如TaxCalculator。
C#
TaxCalculator calc = container.Resolve<TaxCalculator>();
Visual Basic
Dim calc As TaxCalculator = container.Resolve(Of TaxCalculator)()
容器会自动填充的解决实例中所有的依赖关系。如果TaxCalculator类被定义为另一种类型的依赖。当他的
父类被解析时,ExceptionManager和LogWriter将自动创建并注入。
非静态实例和实例工厂
所有的应用程序块包含非静态实例和非静态工厂取代5.0版本以前的静态方法和实例工厂.新的非静态实例和工厂类
不能直接实例化.
非晶态实例和工厂示例:
下面的示例使用GetInstance方法从异常处理应用模块获得ExceptionManager实例,并调用它的方法。
C#
ExceptionManager em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
em.Process( () => MethodThatMightThrow(), "My Exception Policy");
Visual
Dim em As ExceptionManager = EnterpriseLibraryContainer.Current.GetInstance(Of ExceptionManager)();
em.Process(AddressOf MethodThatMightThrow, "My Exception Policy");
下面的示例使用GetInstance方法从验证应用模块获得ValidatorFactory实例,并使用它创建一个对象来验证 Customer的成员。
view plaincopy to clipboardprint?
C#
ValidatorFactory factory = EnterpriseLibraryContainer.Current.GetInstance<ValidatorFactory>();
Validator<Customer> customerValidator = factory.CreateValidator<Customer>();
Customer myCustomer = new Customer("A name that is too long");
ValidationResults r = customerValidator.Validate(myCustomer);
if (!r.IsValid)
{
throw new InvalidOperationException("Validation error found.");
}
Visual Basic
Dim factory As ValidatorFactory = EnterpriseLibraryContainer.Current.GetInstance(Of
ValidatorFactory)()
Dim customerValidator As Validator(Of Customer)
= factory.CreateValidator(Of Customer)()
Dim myCustomer As New Customer("A name that is too long")
Dim r As ValidationResults = customerValidator.Validate(myCustomer)
If Not r.IsValid Then
Throw New InvalidOperationException("Validation error found.")
End If
遗留的静态态外观( Facades )和工厂
为保持向前兼容
初始化并设置当前容器
EnterpriseLibraryContainer类默认包装一个Unity容器的实例,并通过Current属性和IServiceLocator接口的
实现暴露对它的引用。调用 GetInstance 方法是容器真正的工作。你可以通过配置专门设置一个Unity容器。配置是负责从一个特定的源获得配置信息,并应用到容器中作为一系列类型的注册和映射。下面的例子使用默认的Unity容器配置。
C#
var container = new UnityContainer();
var configurator = new UnityContainerConfigurator(container);
// Read the configuration files and set up the container.
EnterpriseLibraryContainer.ConfigureContainer(configurator, ConfigurationSourceFactory.Create());
// The container is now ready to resolve Enterprise Library objects
Visual
Dim container = New UnityContainer()
Dim configurator = New UnityContainerConfigurator(container)
' Read the configuration files and set up the container.
EnterpriseLibraryContainer.ConfigureContainer(configurator, ConfigurationSourceFactory.Create())
' The container is now ready to resolve Enterprise Library objects
如果你没有在应用程序中是用依赖注入风格,或者如果您使用快捷方式来初始化和填充的容器,你通常不用关心实
现细节。但是有些场合你想改变底层容器,比如:
1。你有一个应用程序为一些事情而使用依赖注入容器,但是仍有就的企业库客户端代码在使用,你希望在不重写
对静态外观调用的情况下整合所有的东西。
2。你的应用程序使用静态外观或者 EnterpriseLibraryContainer.Current.GetInstance 获得企业库对象并且你
希望使用一个源而不是应用程序的配置文件来改变最终配置。
改变容器相当容易。你所需要的就是实现 IServiceLocator 接口。 不过,如果你想从配置源加载配置信息,
你会得益于使用IConfigurationSource实例和配置,以及IServiceLocator接口的实现。
一个实现了IConfigurationSource接口的对象包含企业库的配置信息。企业库附带的几个实现能够通过应用程
序配置文件、单独的文件、内存字典中读取这些信息。它将与配置一起来建立容器。
下面的代码演示如何使用UnityContainerConfigurator配置来建立容器、配置容器、使用ServiceLocator包装
容器。
view plaincopy to clipboardprint?
C#
IUnityContainer container = new UnityContainer();
UnityContainerConfigurator configurator = new UnityContainerConfigurator(container);
IConfigurationSource configSource = ReadConfigSource();
EnterpriseLibraryContainer.ConfigureContainer(configurator, configSource);
IServiceLocator locator = new UnityServiceLocator(container);
EnterpriseLibraryContainer.Current = locator;
Visual Basic
Dim container As IUnityContainer = New UnityContainer()
Dim configurator As UnityContainerConfigurator _
= New UnityContainerConfigurator(container)
Dim configSource As IConfigurationSource = ReadConfigSource()
EnterpriseLibraryContainer.ConfigureContainer(configurator, configSource)
Dim locator As IServiceLocator = New UnityServiceLocator(container)
EnterpriseLibraryContainer.Current = locator
如果您使用的是企业库的默认容器实现(Unity),您可以使用下面的代码实现相同的结果:
view plaincopy to clipboardprint?
C#
EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(ReadConfigSource());
Visual Basic
EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(ReadConfigSource());
转自:http://blog.csdn.net/sfbirp/archive/2010/05/19/5606055.aspx