【发布时间】:2016-03-02 20:18:24
【问题描述】:
正如标题所暗示的那样简单明了,这是否可能使用 Autofac 依赖注入?我一直在到处尝试和寻找..我在这里失去了希望。
我的班级必须是单身 - 这不能改变。我希望它采用一个工作单元工厂 - 用于数据库事务。
请帮我解决这个问题,我很绝望。
尝试过 Func 并以各种可能的方式注册我的工作单元(各种生命周期,无论是否由外部拥有)但失败了,因为工作单元中的 DbContext 已被释放,并且在第一次请求后不再创建
编辑:
添加的代码有望帮助理解我的问题:
public class SingletonDataService : IDataService
{
private _uowFactory;
public SingletonDataService(Func<IEFUnitOfWork> uowFactory)
{
_uowFactory = uowFactory
}
public List<Folder> GetAllFolders ()
{
using (uow = uowFactory())
{
return uow.FoldersRepository.GetAll();
}
}
}
public MyDbContext : DbContext
{
public DbSet<Folder> Folders {get; set;}
public DbSet<Letter> Letters {get; set;}
public MyDbContext() : base("myContext...")
}
public EFUnitOfWork : IEFUnitOfWork, IDisposable
{
public IRepository<Folder> FoldersRepository;
public IRepository<Letter> LettersRepository;
private DbContext _context;
public EFUnitOfWork(IRepository<Folder> folders, IRepository<Letter> letters, DbContext context)
{
_folders = folders;
_letters = letters;
_context = context;
}
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
_context.Dispose();
}
disposed = true;
}
}
}
public Repository<T> : IRepository<T> where T: BaseEntity
{
private DbContext _context;
private DbSet<T> _set
public Repository(DbContext context)
{
_context = context;
_set = _context.Set<T>();
}
}
public LettersController : ApiController
{
private IDataService _dataService;
public LettersController(IDataService dataService)
{
_dataService = dataService;
}
[HttpGet]
public IHttpActionResult GetAllLetters()
{
return Ok(_dataService.GetAllLetters());
}
}
// Must be singleton
builder.Register<SingletonDataService>().As(IDataService).SingleInstance();
builder.RegisterGeneric(typeof(Repository<>))
.As(typeof(IRepository<>))
.InstancePerLifetimeScope();
builder.Register<EFUnitOfWork>().As(IEFUnitOfWork).InstancePerLifetimeScope();
builder.Register<DbContext>().As(AppDbContext).InstancePerLifetimeScope();
在第一个请求中一切正常,在第二个第三个等等我得到这个异常:
system.ObjectDisposedException: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
我清楚地看到它的发生是因为我的存储库中的上下文现在为空,但我不知道如何使用 DI 更改它。
没有 DI,我想要实现的目标如此简单:
如何使用 Autofac 实现以下目标?
public class UowFactory
{
public UowFactory()
{
}
public IEFUnitOfWork Create()
{
var context = new AppDbContext()
var uow = new EFUnitOfWork(new Repository<Folder>(context), new Repository<Letter>(context), context);
return uow;
}
}
【问题讨论】:
-
你注册
DbContext的时间是多久? -
我什么都试过了.. PerLifetimeScope、PerRequest、PerOwned.. 似乎没有任何效果
-
你需要展示一些代码,展示失败的东西。
-
编辑并添加了我的代码。
-
您不应该这样做
using (uow = uowFactory())- 这是处理 uow 而不是将其留给容器来决定的行。将该行更改为uow = uowFactory();
标签: c# entity-framework dependency-injection autofac