我正在使用EF6进行C#MVC5项目。当前,上下文是在UnityConfig.cs类中创建的,该类是从Global中的Application_Start()调用的。请参阅下面的一些使用UnityConfig的类:
public static void RegisterComponents()
{
var container = new UnityContainer();
BlogSite.Domain.BlogSiteModelContainer context = new Domain.BlogSiteModelContainer();
container.RegisterType<IBlogRepository, BlogRepository>(new InjectionConstructor(context));
}
问题是数据库可能会直接更新,因此EF上下文将变得不一致。因此,我需要更改它,以便每次有新的http请求时都重新加载它。
我发现PerRequestLifetimeManager可能是解决此问题的方法,但是,我找不到如何使用此方法的好例子。
我应该如何实施呢?或者,还有更好的方法?
因此,我尝试了一些尝试,但仍无所获。我意识到我可以使用该container.RegisterType()
方法添加一个生命周期管理器,但是我假设这仅适用于存储库,不适用于Entity Framework上下文。
例如
container.RegisterType<IBlogRepository, BlogRepository>(new PerRequestLifetimeManager(), new InjectionConstructor(context));
我仍然不确定如何设置上下文的生存期。我意识到我可能不得不重新格式化代码,但是我在任何地方都找不到这种情况的示例。
我一直在做更多的研究,并研究了创建工作单元以在其中创建上下文并将其传递到存储库的想法。不知道这是否是最好的方法,但似乎是可行的方法。有什么想法吗?
找到了解决方案。我需要创建一个UnitOfWork类,并在其中创建上下文和存储库。然后,我使用Unity通过PerRequestLifetimeManager生命周期管理器将UnitOfWork类注入到控制器中。
因此,我的UnitOfWork类(存储在我的DAL项目中)是:
public class UnitOfWork : IDisposable
{
private static BlogSite.Domain.BlogSiteModelContainer context;
public IBlogRepository blogRepository;
public UnitOfWork()
{
context = new BlogSite.Domain.BlogSiteModelContainer();;
blogRepository = new BlogRepository(context);
}
public void Save()
{
context.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
然后,我使用以下代码在我的UnityConfig类中简单地注册它:
container.RegisterInstance<UnitOfWork>(new UnitOfWork(), new PerRequestLifetimeManager());
然后,在我的控制器中,我对构造函数进行了一些小的更改,以使它们可以接受UnitOfWork而不是存储库。
例如
IBlogRepository blogRepo;
public BlogController(UnitOfWork unitOfWork)
{
blogRepo = unitOfWork.blogRepository;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句