我是否正确使用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;
}
我UnitOfWork
和UnitOfWorkFactory
是这样的:
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();
}
}
你告诉团结一次(单)创建的UnitOfWork:
container.RegisterType<IUnitOfWork, UnitOfWork>(
new ContainerControlledLifetimeManager());
我不认为你想要的。卸下ContainerControlledLifetimeManager()....
谢谢,它工作正常。 – user2065440 2013-02-12 22:43:02
我想这是因为LifetimeManager您正在使用。 (LifetimeManager持有一个给它的实例。)你的实例被处置,但是由于ContainerControlledLifetimeManager的原因,它不会创建一个新的实例。在this文章中,您可以阅读如何解决此问题。
基本上是用Unity.MVC3包,并定义HierarchicalLifetimeManager您IDisposable的依赖关系是个好主意。
谢谢,有趣的arcticle – user2065440 2013-02-12 22:45:41
请添加此异常的堆栈跟踪。 – Steven 2013-02-12 21:56:49