【问题标题】:Unable to build Unity Container - Prism无法构建 Unity 容器 - Prism
【发布时间】:2017-12-07 17:37:00
【问题描述】:

我正在尝试在我的 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() 上崩溃并抛出以下异常:

依赖项解析失败,类型 = "Microsoft.Practices.ServiceLocation.IServiceLocator",名称 = "(none)"。 异常发生时:解决时。

异常是:InvalidOperationException - 当前类型 Microsoft.Practices.ServiceLocation.IServiceLocator 是一个接口,无法构造。您是否缺少类型映射?

发生异常时,容器为:

正在解决 Microsoft.Practices.ServiceLocation.IServiceLocator,(无)

【问题讨论】:

  • 您能否提供您正在使用的 Prism、Unity 和 ServiceLocator 的版本
  • 通用服务定位器 2.0.1,Unit 5.3.2,Prism.wpf 6.3.0,Prism Unit 6.3.0,Prism.Core 6.3.0,

标签: c# wpf inversion-of-control unity-container prism


【解决方案1】:

您收到错误的原因是您使用的版本不兼容。 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 的最新预览版中。

【讨论】:

  • prism 7 仅适用于 xamarin.forms 而我用于 WPF
  • @NaveedKhan Prism 7 可用于 WPF,这也是我在回答您时引用的内容。请阅读我在上面答案中包含的链接中的注释,您将看到 Xamarin Forms、WPF 和 UWP 都有 Prism 7 的预览。如果您转到 NuGet,您也会看到它。
  • 现在在使用最新的 prism 配置应用程序并使用 PrismApplication 后,我遇到了这个错误:{“无法在同一个 AppDomain 中创建多个 System.Windows.Application 实例。”}
  • 确保您不再使用引导程序
  • 那我应该如何初始化应用程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
相关资源
最近更新 更多