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 这样做,但这意味着您的整个解决方案都知道这一事实,我不推荐。完全没有。