我的业务层级(简化代码)有以下类:
public class StatusUpdater : IStatusUpdater
{
private readonly IStatusRepo _statusRepo;
public class StatusUpdater(IStatusRepo statusRepo)
{
_statusRepo = statusRepo;
}
public voic UpdateStatus(int id, string newStatus)
{
_statusRepo.UpdateStatus(id,newStatus);
}
}
所以目前在MVC方面,我正在使用 PerRequestLifetimeManager 来控制 DbContext 的生命周期。
但现在在Windows服务中我无法使用它,所以我打算做以下事情,但感觉不对,因为它看起来很像 ServiceLocator :
using(var container = ConfiguredContainer.CreateChildContainer())
{
var statusUpdater = container.Resolve<IStatusUpdater>();
statusUpdater.UpdateStatus("test");
}
还有其他选择吗?有没有办法在MVC应用程序和Windows服务中使用相同的代码,而无需两种类型的注册:
MVC:
container.RegisterType<IStatusRepo, StatusRepo>(new PerRequestLifetimeManager());
WindowsService:
container.RegisterType<IStatusRepo, StatusRepo>(new HierarchicalLifetimeManager());
答案 0 :(得分:0)
我通常在他们自己的程序集中注册我的类型,很可能就像你一样,但是当有一些特定于执行程序集的东西时,我会在执行程序集的注册中覆盖它。
// In BusinessProcessor
container.RegisterType<IBusinessProcessorA, MyBusinessProcessorA1>();
container.RegisterType<IBusinessProcessorA, MyBusinessProcessorA2>();
container.RegisterType<IBusinessProcessorB, MyBusinessProcessorB1>();
// In DataAccessLayer
container.RegisterType<IRepository, Repository<A>>("A", new HierarchicalLifetimeManager());
container.RegisterType<IRepository, Repository<B>>("B", new HierarchicalLifetimeManager());
container.RegisterType<IRepository, Repository<C>>("C", new HierarchicalLifetimeManager());
// In WindowsService
Register(BusinessProcessor); // Call to have the BusinessProcessor register it's own things.
Register(DataAccessLayer); // Call to have the DataAccessLayer register it's own things.
container.RegisterType<IService, MyService>();
// In WebApplication
Register(BusinessProcessor); // Call to have the BusinessProcessor register it's own things.
Register(DataAccessLayer); // Call to have the DataAccessLayer register it's own things.
container.RegisterType<IController, MyController>();
container.RegisterType<IRepository, Repository<A>>("A", new PerRequestLifetimeManager());
另一种方式可以在DAL中注册具有不同命名注册的存储库,并为BusinessProcessors注册,但这意味着您的整个解决方案都会意识到这一事实,我不会推荐。完全没有。