无法构建 Unity 容器 - Prism
Unable to build Unity Container - Prism
我正尝试在我的 WPF 应用程序中使用 prism。到目前为止,我已经像这样配置了我的容器和视图模型定位器:
protected override void ConfigureContainer()
{
Container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());
Container.RegisterType<IUnitOfWork, UnitOfWork>();
Container.RegisterType<IDbFactory, DbFactory>();
Container.RegisterType<IUnitOfWork, UnitOfWork>("UnitOfWork", new ContainerControlledLifetimeManager());
Container.Resolve<IUnitOfWork>("UnitOfWork");
Container.RegisterType<IDbFactory, DbFactory>("DbFactory", new ContainerControlledLifetimeManager());
Container.Resolve<IDbFactory>("DbFactory");
Container.RegisterType<IRegionManager, RegionManager>();
Container.RegisterInstance<IRegionManager>(new RegionManager(), new ContainerControlledLifetimeManager());
#region Register Repositories
Container.RegisterType<IVendorRepository, VendorRepository>();
Container.RegisterType<IUserRepository, UserRepository>();
Container.RegisterType<IReceiveablesRepository, ReceiveablesRepository>();
Container.RegisterType<IProductUnitsRepository, ProductUnitRepository>();
Container.RegisterType<IPaymentRepository, PaymentRepository>();
Container.RegisterType<IItemRepository, ItemRepository>();
Container.RegisterType<IInvoiceMasterRepository, InvoiceMasterRepository>();
Container.RegisterType<IInvoiceDetailRepository, InvoiceDetailRepository>();
Container.RegisterType<IExpenseTypeRepository, ExpenseTypeRepository>();
Container.RegisterType<IExpenseRepository, ExpenseRepository>();
Container.RegisterType<ICustomerRepository, CustomerRepository>();
Container.RegisterType<ICategoryRepository, CategoryRepository>();
Container.RegisterType<IAddressesRepository, AddressesRepository>();
#endregion
#region Register Services
Container.RegisterType<IVendorService, VendorService>();
Container.RegisterType<IUserService, UserService>();
Container.RegisterType<IReceiveablesService, ReceiveablesService>();
Container.RegisterType<IProductUnitService, ProductUnitService>();
Container.RegisterType<IPaymentService, PaymentService>();
Container.RegisterType<IItemService, ItemService>();
Container.RegisterType<InvoiceMasterService, InvoiceMasterService>();
Container.RegisterType<IInvoiceDetailService, InvoiceDetailService>();
Container.RegisterType<IExpenseTypeService, ExpenseTypeService>();
Container.RegisterType<IExpenseService, ExpenseService>();
Container.RegisterType<ICustomerService, CustomerService>();
Container.RegisterType<ICategoryService, CategoryService>();
Container.RegisterType<IAddressesService, AddressesService>();
#endregion
Container.RegisterType<IDbFactory, DbFactory>("DbFactory", new InjectionConstructor());
Container.RegisterType<IUnitOfWork, UnitOfWork>();
Container.RegisterType<IDbFactory, DbFactory>();
//Container.RegisterType<IService, >();
Container.RegisterType<IEventAggregator, EventAggregator>(new PerThreadLifetimeManager());
Container.RegisterTypeForNavigation<Billing>();
Container.RegisterTypeForNavigation<Sales>();
Container.RegisterTypeForNavigation<Management>();
Container.RegisterTypeForNavigation<Home>();
Container.RegisterTypeForNavigation<Orders>();
Container.RegisterTypeForNavigation<Purchases>();
}
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
Container.RegisterInstance(new DbFactory());
Container.RegisterInstance(new UnitOfWork(Container.Resolve<DbFactory>()));
Container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());
Container.RegisterType<IRegionManager, RegionManager>();
Container.RegisterInstance(new UserRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new UserService(Container.Resolve<UnitOfWork>(),Container.Resolve<UserRepository>()));
Container.RegisterInstance(new VendorRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new VendorService(Container.Resolve<UnitOfWork>(),Container.Resolve<VendorRepository>()));
Container.RegisterInstance(new ReceiveablesRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new ReceiveablesService(Container.Resolve<UnitOfWork>(),Container.Resolve<ReceiveablesRepository>()));
Container.RegisterInstance(new ProductUnitRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new ProductUnitService(Container.Resolve<UnitOfWork>(), Container.Resolve<ProductUnitRepository>()));
Container.RegisterInstance(new PaymentRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new PaymentService(Container.Resolve<UnitOfWork>(), Container.Resolve<PaymentRepository>()));
Container.RegisterInstance(new ItemRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new ItemService(Container.Resolve<UnitOfWork>(), Container.Resolve<ItemRepository>()));
Container.RegisterInstance(new InvoiceMasterRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new InvoiceMasterService(Container.Resolve<UnitOfWork>(), Container.Resolve<InvoiceMasterRepository>()));
Container.RegisterInstance(new InvoiceDetailRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new InvoiceDetailService(Container.Resolve<UnitOfWork>(), Container.Resolve<InvoiceDetailRepository>()));
Container.RegisterInstance(new ExpenseRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new ExpenseService(Container.Resolve<UnitOfWork>(), Container.Resolve<ExpenseRepository>()));
Container.RegisterInstance(new ExpenseTypeRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new ExpenseTypeService(Container.Resolve<UnitOfWork>(), Container.Resolve<ExpenseTypeRepository>()));
Container.RegisterInstance(new CustomerRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new CustomerService(Container.Resolve<UnitOfWork>(), Container.Resolve<CustomerRepository>()));
Container.RegisterInstance(new CategoryRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new CategoryService(Container.Resolve<UnitOfWork>(), Container.Resolve<CategoryRepository>()));
Container.RegisterInstance(new AddressesRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new AddressesService(Container.Resolve<UnitOfWork>(), Container.Resolve<AddressesRepository>()));
Container.RegisterType<IRegionManager, RegionManager>();
Container.RegisterInstance<IRegionManager>(new RegionManager(), new ContainerControlledLifetimeManager());
ViewModelLocationProvider.SetDefaultViewModelFactory((o, type) => Container.Resolve(type));
}
在此之后,当我尝试 运行 我的应用程序时,它在 bootstrap.run() 上崩溃并抛出以下异常:
Resolution of the dependency failed, type = "Microsoft.Practices.ServiceLocation.IServiceLocator", name = "(none)".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, Microsoft.Practices.ServiceLocation.IServiceLocator, is an interface and cannot be constructed. Are you missing a type mapping?
At the time of the exception, the container was:
Resolving Microsoft.Practices.ServiceLocation.IServiceLocator,(none)
您收到错误的原因是您使用的版本不兼容。 Prism 6.3 是针对 Unity 4.0.1 和 CommonServiceLocator 1.3.0 构建的。较新版本的 CommonServiceLocator 和 Unity 包含一些使其与 Prism 6.3 不兼容的重大更改,包括命名空间的更改。
请更新到 Prism 7 预览版以兼容 Unity 5 和 CommonServiceLocator 2。您可以在 Prism 7 本身中获得完整的更改列表 here。我要说的是,我们添加了许多重大更改,特别是在 WPF 的最新预览版中。
我正尝试在我的 WPF 应用程序中使用 prism。到目前为止,我已经像这样配置了我的容器和视图模型定位器:
protected override void ConfigureContainer()
{
Container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());
Container.RegisterType<IUnitOfWork, UnitOfWork>();
Container.RegisterType<IDbFactory, DbFactory>();
Container.RegisterType<IUnitOfWork, UnitOfWork>("UnitOfWork", new ContainerControlledLifetimeManager());
Container.Resolve<IUnitOfWork>("UnitOfWork");
Container.RegisterType<IDbFactory, DbFactory>("DbFactory", new ContainerControlledLifetimeManager());
Container.Resolve<IDbFactory>("DbFactory");
Container.RegisterType<IRegionManager, RegionManager>();
Container.RegisterInstance<IRegionManager>(new RegionManager(), new ContainerControlledLifetimeManager());
#region Register Repositories
Container.RegisterType<IVendorRepository, VendorRepository>();
Container.RegisterType<IUserRepository, UserRepository>();
Container.RegisterType<IReceiveablesRepository, ReceiveablesRepository>();
Container.RegisterType<IProductUnitsRepository, ProductUnitRepository>();
Container.RegisterType<IPaymentRepository, PaymentRepository>();
Container.RegisterType<IItemRepository, ItemRepository>();
Container.RegisterType<IInvoiceMasterRepository, InvoiceMasterRepository>();
Container.RegisterType<IInvoiceDetailRepository, InvoiceDetailRepository>();
Container.RegisterType<IExpenseTypeRepository, ExpenseTypeRepository>();
Container.RegisterType<IExpenseRepository, ExpenseRepository>();
Container.RegisterType<ICustomerRepository, CustomerRepository>();
Container.RegisterType<ICategoryRepository, CategoryRepository>();
Container.RegisterType<IAddressesRepository, AddressesRepository>();
#endregion
#region Register Services
Container.RegisterType<IVendorService, VendorService>();
Container.RegisterType<IUserService, UserService>();
Container.RegisterType<IReceiveablesService, ReceiveablesService>();
Container.RegisterType<IProductUnitService, ProductUnitService>();
Container.RegisterType<IPaymentService, PaymentService>();
Container.RegisterType<IItemService, ItemService>();
Container.RegisterType<InvoiceMasterService, InvoiceMasterService>();
Container.RegisterType<IInvoiceDetailService, InvoiceDetailService>();
Container.RegisterType<IExpenseTypeService, ExpenseTypeService>();
Container.RegisterType<IExpenseService, ExpenseService>();
Container.RegisterType<ICustomerService, CustomerService>();
Container.RegisterType<ICategoryService, CategoryService>();
Container.RegisterType<IAddressesService, AddressesService>();
#endregion
Container.RegisterType<IDbFactory, DbFactory>("DbFactory", new InjectionConstructor());
Container.RegisterType<IUnitOfWork, UnitOfWork>();
Container.RegisterType<IDbFactory, DbFactory>();
//Container.RegisterType<IService, >();
Container.RegisterType<IEventAggregator, EventAggregator>(new PerThreadLifetimeManager());
Container.RegisterTypeForNavigation<Billing>();
Container.RegisterTypeForNavigation<Sales>();
Container.RegisterTypeForNavigation<Management>();
Container.RegisterTypeForNavigation<Home>();
Container.RegisterTypeForNavigation<Orders>();
Container.RegisterTypeForNavigation<Purchases>();
}
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
Container.RegisterInstance(new DbFactory());
Container.RegisterInstance(new UnitOfWork(Container.Resolve<DbFactory>()));
Container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());
Container.RegisterType<IRegionManager, RegionManager>();
Container.RegisterInstance(new UserRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new UserService(Container.Resolve<UnitOfWork>(),Container.Resolve<UserRepository>()));
Container.RegisterInstance(new VendorRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new VendorService(Container.Resolve<UnitOfWork>(),Container.Resolve<VendorRepository>()));
Container.RegisterInstance(new ReceiveablesRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new ReceiveablesService(Container.Resolve<UnitOfWork>(),Container.Resolve<ReceiveablesRepository>()));
Container.RegisterInstance(new ProductUnitRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new ProductUnitService(Container.Resolve<UnitOfWork>(), Container.Resolve<ProductUnitRepository>()));
Container.RegisterInstance(new PaymentRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new PaymentService(Container.Resolve<UnitOfWork>(), Container.Resolve<PaymentRepository>()));
Container.RegisterInstance(new ItemRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new ItemService(Container.Resolve<UnitOfWork>(), Container.Resolve<ItemRepository>()));
Container.RegisterInstance(new InvoiceMasterRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new InvoiceMasterService(Container.Resolve<UnitOfWork>(), Container.Resolve<InvoiceMasterRepository>()));
Container.RegisterInstance(new InvoiceDetailRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new InvoiceDetailService(Container.Resolve<UnitOfWork>(), Container.Resolve<InvoiceDetailRepository>()));
Container.RegisterInstance(new ExpenseRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new ExpenseService(Container.Resolve<UnitOfWork>(), Container.Resolve<ExpenseRepository>()));
Container.RegisterInstance(new ExpenseTypeRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new ExpenseTypeService(Container.Resolve<UnitOfWork>(), Container.Resolve<ExpenseTypeRepository>()));
Container.RegisterInstance(new CustomerRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new CustomerService(Container.Resolve<UnitOfWork>(), Container.Resolve<CustomerRepository>()));
Container.RegisterInstance(new CategoryRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new CategoryService(Container.Resolve<UnitOfWork>(), Container.Resolve<CategoryRepository>()));
Container.RegisterInstance(new AddressesRepository(Container.Resolve<DbFactory>()),new ContainerControlledLifetimeManager());
Container.RegisterInstance(new AddressesService(Container.Resolve<UnitOfWork>(), Container.Resolve<AddressesRepository>()));
Container.RegisterType<IRegionManager, RegionManager>();
Container.RegisterInstance<IRegionManager>(new RegionManager(), new ContainerControlledLifetimeManager());
ViewModelLocationProvider.SetDefaultViewModelFactory((o, type) => Container.Resolve(type));
}
在此之后,当我尝试 运行 我的应用程序时,它在 bootstrap.run() 上崩溃并抛出以下异常:
Resolution of the dependency failed, type = "Microsoft.Practices.ServiceLocation.IServiceLocator", name = "(none)". Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, Microsoft.Practices.ServiceLocation.IServiceLocator, is an interface and cannot be constructed. Are you missing a type mapping?
At the time of the exception, the container was:
Resolving Microsoft.Practices.ServiceLocation.IServiceLocator,(none)
您收到错误的原因是您使用的版本不兼容。 Prism 6.3 是针对 Unity 4.0.1 和 CommonServiceLocator 1.3.0 构建的。较新版本的 CommonServiceLocator 和 Unity 包含一些使其与 Prism 6.3 不兼容的重大更改,包括命名空间的更改。
请更新到 Prism 7 预览版以兼容 Unity 5 和 CommonServiceLocator 2。您可以在 Prism 7 本身中获得完整的更改列表 here。我要说的是,我们添加了许多重大更改,特别是在 WPF 的最新预览版中。