我有一个控制台应用程序 - Worker - 侦听来自排队系统的消息,并执行一些涉及每个消息的数据库访问的任务。我使用EF 6访问MSSQL数据库,在我的实现中我使用工作单元。 我的DI容器是Autofac - 我是新手 - 我用它来绑定IUnitOfWork到UnitOfWork的许多其他东西。
我在这里遇到的问题我不知道如何处理:我想为每条消息添加一个新的UnitOFWork实例,所以它不能是Singleton,但在同一个消息处理期间我需要相同的UnitOfWork实例,所以它不能是 - 每个依赖的实例 - 。
谢谢。
答案 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>();
}