EntityFramework用法探索(五)引入Unity

上文的EntityFramework用法中,我们引入了Repository模式和UnitOfWork模式。

探索还没有结束,我们引入Unity依赖注入容器。那用Unity做什么呢?

在上文中,我们手工定义了CustomerRepository中DbContext的,

1       DbContext context = new RETAILContext();
2       DbContextAdapter contextAdaptor = new DbContextAdapter(context);
3 
4       IObjectSetFactory objectSetFactory = contextAdaptor;
5       _repository = new Repository<Customer>(objectSetFactory);
6 
7       IObjectContext objectContext = contextAdaptor;
8       _uow = new UnitOfWork(objectContext);

但如果表数量过多,手工编码会变得非常繁琐,使用IoC容器提供的功能来解决。

 1       IUnityContainer container = new UnityContainer()
 2         .RegisterType(typeof(IRepository<>), typeof(Repository<>), new ContainerControlledLifetimeManager())
 3         .RegisterType<IUnitOfWork, UnitOfWork>(new ContainerControlledLifetimeManager())
 4         .RegisterType<DbContext, RETAILContext>(new ContainerControlledLifetimeManager())
 5         .RegisterType<DbContextAdapter>(new ContainerControlledLifetimeManager())
 6         .RegisterType<IObjectSetFactory, DbContextAdapter>(new ContainerControlledLifetimeManager())
 7         .RegisterType<IObjectContext, DbContextAdapter>(new ContainerControlledLifetimeManager())
 8         .RegisterType<ICustomerRepository, CustomerRepository>(new ContainerControlledLifetimeManager());
 9 
10       ICustomerRepository customerRepository = container.Resolve<ICustomerRepository>();

则在CustomerRepository中的配置会简介些,

1     public CustomerRepository(IUnityContainer container)
2     {
3       Mapper.CreateMap<DomainModels.Customer, Customer>();
4       Mapper.CreateMap<Customer, DomainModels.Customer>();
5 
6       _repository = container.Resolve<Repository<Customer>>();
7       _uow = container.Resolve<UnitOfWork>();
8     }

显然同样的测试代码仍然可以工作,不再赘述。

最后,如果需要可以将UnityContainer注入到ServiceLocator中,以备使用。

1       UnityServiceLocator locator = new UnityServiceLocator(container);
2       ServiceLocator.SetLocatorProvider(() => locator);

完整代码和索引

EntityFramework用法探索系列

完整代码下载

posted @ 2013-06-06 21:22  sangmado  阅读(3230)  评论(2编辑  收藏  举报