Search code examples
c#wpfinversion-of-controlunity-containerprism

Unable to build Unity Container - Prism


I am trying to use prism in my WPF application. So far i have configured my container and View model locator like this:

   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));
    }

after this when i try to run my application it breaks down on bootstrap.run() and following exception is throw:

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)


Solution

  • The reason that you're getting errors is that you are using incompatible versions. Prism 6.3 is built against Unity 4.0.1 and CommonServiceLocator 1.3.0. The newer versions of of CommonServiceLocator and Unity contain several breaking changes that make it incompatible with Prism 6.3, including a change of namespaces.

    Please update to the Prism 7 preview for compatibility with Unity 5 and CommonServiceLocator 2. You can get a full list of changes within Prism 7 itself here. I will say that there are a number of breaking changes that we've added particularly in the latest preview for WPF.