依赖注入的对象处理

时间:2011-01-03 10:25:39

标签: c# dependency-injection repository-pattern idisposable

我创建了一个我想在页面后面的代码中使用的存储库类。我在代码隐藏页面中使用构造函数注入来实例化存储库。

存储库类:

BritanniaPremierEntities PBEntities = new BritanniaPremierEntities();

public IQueryable<TradeRoutes> GetRoutes()
{
    var routes = PBEntities.TradeRoutes.OrderBy(c => c.ConsignmentDate);        

    return routes;
}

public IQueryable<TradeRoutes> GetExpiredRoutes()
{
    var routes = PBEntities.TradeRoutes.Where(
        c => c.ConsignmentDate <= System.DateTime.Now);

    return routes;
}

页面后面的代码

private IRepository repos;

public Admin_TradeRoutesAdmin()
    : this(new Repository()) 
{
}

public Admin_TradeRoutesAdmin(IRepository repos)
{
    this.repos = repos;
}

public IQueryable GetTradeRoutes()
{        
    // call repository method
    return repos.GetRoutes();
}

这是我有点困惑的地方。我应该如何确保存储库正确处理?例如,我无法使用代码隐藏页面中的语句包装存储库调用,从而在存储库中使用dispose方法。

2 个答案:

答案 0 :(得分:5)

您应该使用Register Resolve Release pattern

具体而言,您应该记住始终发布您解决的内容。作曲家有责任跟踪是否应该处理依赖关系。这是不是微不足道的,因为它取决于不同的因素:

  • 依赖项是否实现了IDisposable?
  • 依赖关系的生命周期是否表明它应该现在或以后处理?

这是一项非常复杂的任务,您应该使用适当的DI容器来完成这项工作。

但是,请记住,这最终取决于您的DI Container是否支持退役。例如,Castle Windsor确实在StructureMap没有。

答案 1 :(得分:1)

嗯,通常的想法是,只要它是IDisposable,DI容器创建的任何内容都会被丢弃。唯一的问题是何时发生。我怀疑不同容器之间可能存在差异,但我对此的看法是在正在创建的对象中实现Dispose(),并在正在注入的对象上显式调用Dispose()