Unity 子容器 HierarchicalLifetimeManager mvc 和 windows 服务
Unity child container HierarchicalLifetimeManager mvc and windows service
我的业务层级别(简化代码)有以下class:
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());
Windows 服务:
container.RegisterType<IStatusRepo, StatusRepo>(new HierarchicalLifetimeManager());
我通常在它们自己的程序集中注册我的类型,很可能就像您所做的那样,但是当有特定于执行程序集的内容时,我会在该执行程序集的注册中覆盖它。
// 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 这样做,但这意味着您的整个解决方案都知道这一事实,我不推荐。完全没有。
我的业务层级别(简化代码)有以下class:
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());
Windows 服务:
container.RegisterType<IStatusRepo, StatusRepo>(new HierarchicalLifetimeManager());
我通常在它们自己的程序集中注册我的类型,很可能就像您所做的那样,但是当有特定于执行程序集的内容时,我会在该执行程序集的注册中覆盖它。
// 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 这样做,但这意味着您的整个解决方案都知道这一事实,我不推荐。完全没有。