Unity 在现在项目中,已经得到广泛使用。今天我们来看如何在XML配制文件配制泛型。如下我们这样的一个类型:
1: public interface IRepository<T>
2: { 3: IUnitOfWork UnitOfWork { get; set; } 4: IQueryable<T> All();5: IQueryable<T> Find(Expression<Func<T, bool>> expression);
6: void Attach(T entity);
7: void Add(T entity);
8: void Delete(T entity);
9: void Save();
10: }这是一个Repository模式,假设有以下的实现:
1: public class EFRepository<T> : IRepository<T> where T : class
2: {3: public IUnitOfWork UnitOfWork { get; set; }
4: private IObjectSet<T> _objectset;
5: private IObjectSet<T> ObjectSet
6: { 7: get 8: {9: if (_objectset == null)
10: { 11: _objectset = UnitOfWork.Context.CreateObjectSet<T>(); 12: }13: return _objectset;
14: } 15: } 16: 17: public virtual IQueryable<T> All()
18: {19: return ObjectSet.AsQueryable();
20: } 21: 22: public IQueryable<T> Find(Expression<Func<T, bool>> expression)
23: {24: return ObjectSet.Where(expression).AsQueryable();
25: } 26: 27: public void Add(T entity)
28: { 29: ObjectSet.AddObject(entity); 30: } 31: 32: public void Attach(T entity)
33: { 34: ObjectSet.Attach(entity); 35: } 36: 37: public void Delete(T entity)
38: { 39: ObjectSet.DeleteObject(entity); 40: } 41: 42: public void Save()
43: { 44: UnitOfWork.Save(); 45: } 46: }在代码中注册是这样的:
1: container.RegisterType<IUnitOfWork, EFUnitOfWork>(); 2: container.RegisterType<IRepository<Product>, EFRepository<Product>>();好的,现在我们从配制文件读取:
1: private static IUnityContainer container;
2: 3: static ObjectFactory()
4: {5: container = new UnityContainer();
6: 7: //container.RegisterType<IUnitOfWork, EFUnitOfWork>();
8: //container.RegisterType<IRepository<Product>, EFRepository<Product>>();
9: 10: string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EntLib.config.xml");
11: var map = new ExeConfigurationFileMap { ExeConfigFilename = path };
12: 13: System.Configuration.Configuration config 14: = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 15: UnityConfigurationSection section16: = (UnityConfigurationSection)config.GetSection("unity");
17: section.Containers["DefContainer"].Configure(container);
18: } 19: 20: public static T GetInstance<T>()
21: {22: return container.Resolve<T>();
23: }关键的XML配制在这儿:
1: <configuration>
2: <configSections>
3: <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
4: </configSections>
5: <unity>
6: <typeAliases>
7: <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
8: <typeAlias alias="transparentProxy" type="Microsoft.Practices.Unity.InterceptionExtension.TransparentProxyInterceptor, Microsoft.Practices.Unity.Interception" />
9: <typeAlias alias="typeMatchingRule" type="Microsoft.Practices.Unity.InterceptionExtension.TypeMatchingRule, Microsoft.Practices.Unity.Interception" />
10: <typeAlias alias="interception" type="Microsoft.Practices.Unity.InterceptionExtension.Interception, Microsoft.Practices.Unity.Interception" />
11: <typeAlias alias="IRepository`1" type="TestEF4.IRepository`1, TestEF4" />
12: <typeAlias alias="IUnitofwork" type="TestEF4.IUnitOfWork, TestEF4" />
13: </typeAliases>
14: <containers>
15: <container name="DefContainer">
16: <types>
17: <type type="IUnitofwork" mapTo="TestEF4.EFUnitOfWork, TestEF4">
18: <lifetime type="singleton" />
19: </type>
20: <type type="IRepository`1" mapTo="TestEF4.EFRepository`1, TestEF4">
21: <lifetime type="singleton" />
22: </type>
23: </types>
24: </container>
25: </containers>
26: </unity>
27: </configuration>
注意加粗的字体就是我们泛型。让我们来测试一下:
1: [Test]2: public void TestUnityGenericTypeConfig()
3: { 4: var productRepository = RepositoryHelper.GetProductRepository(); 5: var totalentities = productRepository.All(); 6: 7: Assert.IsNotNull(productRepository); 8: Assert.IsInstanceOf<ProductRepository>(productRepository); 9: Assert.IsInstanceOf<EFRepository<Product>>(productRepository.Repository); 10: Assert.IsInstanceOf<EFUnitOfWork>(productRepository.Repository.UnitOfWork); 11: }一切OK了,这就实用使用配制文件实现DI解析泛型。希望对您开发有帮助。
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
浙公网安备 33010602011771号