我是否正确使用Unity和UnitOfWork?

问题描述:

我正确吗?内存使用情况或性能有问题吗?我是否正确使用Unity和UnitOfWork?

UPD:错误与设置上下文是固定的。

我使用的是团结与工作模式的单位。当我运行我的应用程序的第一次,一切正常,但是一旦我刷新页面,应用程序有以下例外崩溃:

的操作,因为的DbContext已经布置无法完成。

我的DI配置是这样的:

private static IUnityContainer BuildUnityContainer() 
{ 
    var container = new UnityContainer(); 

    container.RegisterType<DataContext>(); 

    container.RegisterType<IUnitOfWorkFactory, UnitOfWorkFactory>(); 

    container.RegisterType<IUnitOfWork, UnitOfWork>(); 

    container.RegisterType<IProductRepository, ProductRepository>(); 

    return container; 
} 

UnitOfWorkUnitOfWorkFactory是这样的:

public class UnitOfWork : IUnitOfWork 
{ 
    private readonly IUnityContainer _container; 
    private bool _disposed; 

    public UnitOfWork(IUnityContainer container) 
    { 
     _container = container; 
     Context = _container.Resolve<DataContext>(); 
    } 

    internal DataContext Context { get; set; } 

    public TRepository GetRepository<TRepository>() 
     where TRepository : class 
    { 
     return _container.Resolve<TRepository>(); 
    } 

    public void Commit() 
    { 
     Context.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     if (!_disposed) 
     { 
      _disposed = true; 
      Context.Dispose(); 
     } 
    } 
} 

public class UnitOfWorkFactory : IUnitOfWorkFactory 
{ 
    private readonly IUnityContainer _container; 

    public UnitOfWorkFactory(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public IUnitOfWork CreateUnitOfWork() 
    { 
     return _container.Resolve<UnitOfWork>(); 
    } 
} 

UnitOfWork包含GetRepository方法,允许返回任何存储库。这里就是这样一个资源库的一个例子:

public class ProductRepository : BaseRepository<Product>, 
    IProductRepository 
{ 
    public ProductRepository(UnitOfWork unitOfWork) 
     :base(unitOfWork) 
    { 
    } 

    public Product Create(Product entity) 
    { 
     return DataBase.Add(entity); 
    } 

    public Product Remove(Product entity) 
    { 
     return DataBase.Remove(entity); 
    } 

    public Product Get(Int32 entityId) 
    { 
     return DataBase.FirstOrDefault(x => x.Id == entityId); 
    } 
} 

public class BaseRepository<TEntity> 
    where TEntity : class 
{ 
    internal BaseRepository(UnitOfWork unitOfWork) 
    { 
     UnitOfWork = unitOfWork; 

    } 

    internal UnitOfWork UnitOfWork { get; private set; } 

    internal virtual IDbSet<TEntity> DataBase 
    { 
     get { return UnitOfWork.Context.Set<TEntity>(); } 
    } 
} 

我的MVC控制器取决于IUnitOfWorkFactory。这里是AccountController例如:

public class AccountController : Controller 
{ 
    private readonly IUnitOfWorkFactory _unitOfWorkFactory; 

    public AccountController(IUnitOfWorkFactory unitOfWorkFactory) 
    { 
     _unitOfWorkFactory = unitOfWorkFactory; 
    } 

    [AllowAnonymous] 
    public ActionResult Login(string returnUrl) 
    { 
     ViewBag.ReturnUrl = returnUrl; 

     using (var uow = _unitOfWorkFactory.CreateUnitOfWork()) 
     { 
      var rep = uow.GetRepository<IProductRepository>(); 

      var prod = rep.GetById(1); 
     } 

     return View(); 
    } 
} 
+0

请添加此异常的堆栈跟踪。 – Steven 2013-02-12 21:56:49

你告诉团结一次(单)创建的UnitOfWork:

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

我不认为你想要的。卸下ContainerControlledLifetimeManager()....

+0

谢谢,它工作正常。 – user2065440 2013-02-12 22:43:02

我想这是因为LifetimeManager您正在使用。 (LifetimeManager持有一个给它的实例。)你的实例被处置,但是由于ContainerControlledLifetimeManager的原因,它不会创建一个新的实例。在this文章中,您可以阅读如何解决此问题。

基本上是用Unity.MVC3包,并定义HierarchicalLifetimeManager您IDisposable的依赖关系是个好主意。

+0

谢谢,有趣的arcticle – user2065440 2013-02-12 22:45:41