早在Enterprise Library 5.0之前,就已经有了一个Common Service Locator.在这里假设您对Enterprise Library已经有一定了解。
在Enterprise Library 5.0中,我们通常会使用EnterpriseLibraryContainer.Current,实际上它是IServiceLocator接口。例如下面的代码:
1: [TestMethod]
2: public void TestGetExceptionManagerFromDefaultEntLibContainer()
3: {
4: var exceptionManager=
5: EnterpriseLibraryContainer.Current.
6: GetInstance<Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager>();
7:
8: Assert.IsNotNull(exceptionManager);
9: }
我们从容器中获取一个ExceptionManager的对象.默认也是使用是Unity. 我们可以看这样一段CODE在EnterpriseLibraryContainer类中:
1: public static IServiceLocator CreateDefaultContainer(IConfigurationSource configurationSource)
2: {
3: IUnityContainer container = new UnityContainer();
4: UnityContainerConfigurator configurator = new UnityContainerConfigurator(container);
5: ConfigureContainer(configurator, configurationSource);
6: return new UnityServiceLocator(container);
7: }
所以如果您使用xml配置文件来配置Unity,那么就要这样实现:
1: [TestMethod]
2: public void TestGetExceptionManagerFromServiceLocator()
3: {
4: // Create the container
5: var container = new UnityContainer();
6:
7: // Configurator will read Enterprise Library configuration
8: // and set up the container
9: var configurator = new UnityContainerConfigurator(container);
10:
11: // Configuration source holds the new configuration we want to use
12: // load this in your own code
13: var configSource = new FileConfigurationSource("EntLib.config.xml");
14:
15: // Configure the container
16: EnterpriseLibraryContainer.CreateDefaultContainer(configSource);
17:
18: // Wrap in ServiceLocator
19: var locator = new UnityServiceLocator(container);
20:
21: // And set Enterprise Library to use it
22: EnterpriseLibraryContainer.Current = locator;
23:
24: var exceptionManager =
25: EnterpriseLibraryContainer.Current.
26: GetInstance<Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager>();
27:
28: Assert.IsNotNull(exceptionManager);
29: }
这个地方我们读取一个单独的文件EntLib.config.xml,当时也可用其他方式。但这个方式不能解析自定义的对象。通常我们更愿意直接自定义使用ServiceLocator,如下:
1: [TestMethod]
2: public void TestGetExceptionManagerFromCustomerServiceLocator()
3: {
4: var container = new UnityContainer();
5:
6: string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EntLib.config.xml");
7: var map = new ExeConfigurationFileMap { ExeConfigFilename = path };
8:
9: var config
10: = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
11: var section
12: = (UnityConfigurationSection)config.GetSection("unity");
13: section.Configure(container, "DefContainer");
14:
15: var serviceocator = new UnityServiceLocator(container);
16:
17: var exceptionManager = serviceocator.
18: GetInstance<Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager>();
19:
20: Assert.IsNotNull(exceptionManager);
21: }
注意,XML需要这样配置,关键在第3行,必须加个extension才能获取EnterpriseLibrary中的Object
1: <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
2: <container name="DefContainer">
3: <extension type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Unity.EnterpriseLibraryCoreExtension,Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
4: </container>
5: </unity>
下面我们测试一下自定义的Object,XML配置如下:
1: <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
2: <alias alias="IEmployeeBusinessObject" type="BusinessObject.IEmployeeBusinessObject, BusinessObject" />
3: <alias alias="EmployeeBusinessObject" type="BusinessObject.EmployeeBusinessObject, BusinessObject" />
4: <container name="DefContainer">
5: <extension type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Unity.EnterpriseLibraryCoreExtension,Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
6: <register type="IEmployeeBusinessObject" mapTo="EmployeeBusinessObject">
7: <lifetime type="singleton" />
8: </register >
9: </container>
10: </unity>
UnitTest, IEmployeeBusinessObject是我们定义的一个Interface。
1: [TestMethod]
2: public void TestDirectGetCustomerobject()
3: {
4: var container = new UnityContainer();
5:
6: string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EntLib.config.xml");
7: var map = new ExeConfigurationFileMap { ExeConfigFilename = path };
8:
9: var config
10: = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
11: var section
12: = (UnityConfigurationSection)config.GetSection("unity");
13: section.Configure(container, "DefContainer");
14:
15: var serviceocator = new UnityServiceLocator(container);
16:
17: var employee = serviceocator.GetInstance<IEmployeeBusinessObject>();
18:
19: Assert.IsNotNull(employee);
20: }
参考:
Creating and Referencing Enterprise Library Objects
希望这篇POST对您开发有帮助。
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)