0

これを行うのは正しいですか?メモリ使用量またはパフォーマンスに問題がある可能性はありますか?

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;
}

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();
    }
}
4

2 に答える 2

0

これは、使用している LifetimeManager が原因だと思います。(LifetimeManager は、それに与えられたインスタンスを保持します。)インスタンスは破棄されますが、ContainerControlledLifetimeManager があるため、新しいインスタンスは作成されません。この記事ではこの問題を解決する方法を読むことができます。

基本的に、Unity.MVC3 パッケージを使用し、IDisposable の依存関係に HierarchicalLifetimeManager を定義することをお勧めします。

于 2013-02-12T22:05:42.607 に答える