在上文的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用法探索系列
