Autofac,Console应用程序和UnitOfWork

时间:2016-03-02 23:22:44

标签: console-application autofac unit-of-work

我有一个控制台应用程序 - Worker - 侦听来自排队系统的消息,并执行一些涉及每个消息的数据库访问的任务。我使用EF 6访问MSSQL数据库,在我的实现中我使用工作单元。 我的DI容器是Autofac - 我是新手 - 我用它来绑定IUnitOfWork到UnitOfWork的许多其他东西。

我在这里遇到的问题我不知道如何处理:我想为每条消息添加一个新的UnitOFWork实例,所以它不能是Singleton,但在同一个消息处理期间我需要相同的UnitOfWork实例,所以它不能是 - 每个依赖的实例 - 。

谢谢。

2 个答案:

答案 0 :(得分:2)

如果按照@ MaDeRkAn的回答直接使用容器,您也可以使用Func<Owned<IUnitOfWork>>代替:

containerBuilder
    .RegisterType<UnitOfWork>()
    .As<IUnitOfWork>()
    .InstancePerLifetimeScope();

public class MessageQueueWorker
{
    private Func<Owned<IUnitOfWork>> unitOfWorkFactory;

    public MessageQueueWorker(Func<Owned<IUnitOfWork>> unitOfWorkFactory)
    {
        this.unitOfWorkFactory = unitOfWorkFactory
    }

    public void ProcessMessage(message)
    {
        using (Owned<IUnitOfWork> unitOfWork = this.unitOfWorkFactory())
        {
            //access the actual IUnitOfWork with the .Value property
            unitOfWork.Value.DatabaseTable....

            // when the using scope ends the IUnitOfWork and all it's
            // "non shared" dependencies will be disposed
        }
    }
}

提示: 关于“非共享”依赖关系:这些依赖关系的范围与IUnitOfWork相同或更短。注入SingleInstance的{​​{1}}当然不会被处理掉。

答案 1 :(得分:1)

您应将其注册为Instance Per Lifetime Scope

当消息到来时,您应该开始新的Lifetime Scope并在那里解析IUnitOFWork。这就是你在lifetimescope中拥有1 UnitOFWork个物体的方式。

您的注册应该是这样的:

builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerLifetimeScope();

你应该像这样解决IUnitOfWork

var message=GetMessageFromBus();
using(var myLifetime = container.BeginLifetimeScope())
{
    var myUnitOFWork = myLifetime.Resolve<IUnitOfWork>();
}