Unity子容器HierarchicalLifetimeManager mvc和windows服务

时间:2017-04-10 16:00:41

标签: c# asp.net-mvc entity-framework unity-container object-lifetime

我的业务层级(简化代码)有以下类:

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

1 个答案:

答案 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注册,但这意味着您的整个解决方案都会意识到这一事实,我不会推荐。完全没有。