これを行うのは正しいですか?メモリ使用量またはパフォーマンスに問題がある可能性はありますか?
UPD:破棄されたコンテキストのバグが修正されました。
Unit of Work パターンで Unity を使用しています。アプリケーションを初めて実行すると、すべてが期待どおりに機能しますが、ページを更新すると、次の例外でアプリがクラッシュします。
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();
}
}