Unity分层解析类型

时间:2014-04-04 10:59:44

标签: c# .net inversion-of-control unity-container

我正在创建一个复杂的服务,我遇到了一个小问题。 这是我的情况:

ITask :这些是我的服务调用以执行大而长的执行事务的类。

IStep :任务可以包含步骤,这些步骤本身执行可以在其他任务中重复使用的代码片段(例如"创建用户" -step,& #34;创建项目" -step,...)

现在,任务和步骤都需要一个工作单元(包含多个EF上下文)。这些需要在单个任务中共享(因此需要在单个任务的所有步骤中使用相同的unitOfWork,但仅在该一个任务中使用)。这是因为EF内部的变化跟踪。

所以我认为我需要创建一个统一的东西,我可以告诉它需要检索一个步骤的上下文(在任务中)。

我目前正在使用" ContainerControlledLifetimeManager",这适用于单个任务,但不适用于多个任务..

container.RegisterType<IUnitOfWork, UnitOfWork>(new ContainerControlledLifetimeManager());

msdn说:一个LifetimeManager,它保存给它的实例。放置ContainerControlledLifetimeManager时,实例随之处理。

我该处理什么?我如何/在哪里处理它(我没有引用lifeManager?!)? 如何使用构造函数注入?。我应该使用房产注入并使用&#34;经理&#34; - &GT; container.Resolve&GT;(task.Id)

由于

1 个答案:

答案 0 :(得分:1)

这里的诀窍是让UnitOfWork在某个范围内持续生活。并且需要用这样的范围包装单个线程。

使用HierarchicalLifetimeManager在Unity中完成在显式范围内注册实例并启动新的子容器:

container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager());

围绕执行任务包装新的子容器范围,可以使用装饰器来完成:

public class HierarchicalLifetimeTaskDecorator : ITask
{
    private readonly Container container;

    public HierarchicalLifetimeTaskDecorator(Container container) {
        this.container = container;
    }

    public void Execute() {
        using (var scope = container.CreateChildContainer()) {
            ITask realTask = scope.Resolve<ITask>();
            realTask.Execute();
        }
    }
}