我有一个项目可以使用Unity完美运行。我尝试切换到使用简单注射器,现在没有任何更改会保存在我的数据库中。我相信它与注册组件的寿命有关。这里是Unity容器注册:IoC Unity和Simple Injector之间的注册区别
private IUnityContainer GetUnityContainer()
{
IUnityContainer container = new UnityContainer()
.RegisterType<IDatabaseFactory, DatabaseFactory>(
new HttpContextLifetimeManager<IDatabaseFactory>())
.RegisterType<IUnitOfWork, UnitOfWork>(
new HttpContextLifetimeManager<IUnitOfWork>())
.RegisterType<ICategoryRepository, CategoryRepository>(
new HttpContextLifetimeManager<ICategoryRepository>())
.RegisterType<ICategoryService, CategoryService>(
new HttpContextLifetimeManager<ICategoryService>());
return container;
}
这里是新的简单注射器注册。我不确定HttpContextLifetimeManager
如何进入Simple Injector。 MVC是统一示例的客户端,但我正在更改为WPF项目和Simple Injector。任何建议,非常感谢。谢谢。
@Steven。谢谢你的评论。我刚刚发现,由于我的RepositoryBase和UnitOfWork在其构造函数中注入了一个IDatabaseFactory,所以我需要使用container.RegisterSingle<IDatabaseFactory, DatabaseFactory>()
。这解决了一个问题。尽管如此,我仍然有一个问题。由于我使用的应用程序是WPF,因此RegisterPerWebRequest将如何工作?
我的项目有一个DataLayer >> BusinessLayer >> WcfService >> WPF前端。 Simple Injector在WcfService项目上设置,业务层有Boostrapper在其中注册项目。截至目前,我的WPF客户端将GetAllCountries()并显示在网格中。如果我更改名称并尝试更新,则会得到“ObjectStateManager中已存在具有相同键的对象,而ObjectStateManager无法使用同一个键跟踪多个对象。”错误。我做了一些调试,发现在WPF客户端的GetCountries服务调用之后,当我回去尝试更新时,我发现所有国家都通过dbContext.ChangeTracker.Entries()附加到上下文。在这一点上,我应该没有实体被跟踪,因为我的上下文应该在第一个工作单元后处理。
在MVC应用程序中,RegisterPerWebRequest修复了这个问题,但WPF的等价物是什么?我现在要安装扩展程序,并尝试它,但我有一种感觉,它不是我正在寻找的解决方案..或者它是什么?再次感谢您的帮助。
好的。我做了更多的挖掘并找到了可行的解决方案。我只是不确定它是否是正确的。不管怎样,现在在我的BLL那里是登记的东西引导程序,我可以这样注册:
container.RegisterPerWcfOperation<IDatabaseFactory, DatabaseFactory>();
container.RegisterPerWcfOperation<IUnitOfWork, UnitOfWork>();
container.RegisterPerWcfOperation<ICountryRepository, CountryRepository>();
这给了我什么,我一直在寻找。只有一个DatabaseFactory实例被创建,因此我的存储库和工作单元就像他们应该分享它一样。另外,在客户端上的GetCountries()之后,当我再次调用服务来执行和更新时,我检查了dbContext.ChangeTracker.Entries()并查看没有实体被跟踪,这是正确的。我现在可以附加,设置为修改,并调用SaveChanges而不会出现重复键错误。这看起来好吗?谢谢。
请参阅我对帖子所做的编辑以回应您的建议。并感谢您的帮助...... PS,一旦我解决这个问题,我将尝试使用命令/查询处理程序设置项目,如您以前所建议的。我只想先充分理解这一点。谢谢。 – BBauer42
@ BBauer42:查看我的更新。 – Steven