C# 依赖注入的对象处理

C# 依赖注入的对象处理,c#,dependency-injection,repository-pattern,idisposable,C#,Dependency Injection,Repository Pattern,Idisposable,我已经创建了一个要在代码隐藏页面中使用的存储库类。我在代码隐藏页面中使用构造函数注入来实例化存储库 存储库类: BritanniaPremierEntities PBEntities = new BritanniaPremierEntities(); public IQueryable<TradeRoutes> GetRoutes() { var routes = PBEntities.TradeRoutes.OrderBy(c => c.ConsignmentDat

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

存储库类:

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

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

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

具体地说,您应该记住始终发布您解决的问题。编写者有责任跟踪是否应该处理依赖关系。这不是微不足道的,因为它取决于不同的因素:

  • 依赖项是否实现IDisposable
  • 依赖项的生存期是否指示应立即或稍后释放它
这是一项非常复杂的任务,因此您应该为该作业使用适当的DI容器


但是,请记住,这最终取决于DI容器是否支持退役。例如,Castle Windsor有,StructureMap没有。

有很多事情要考虑,但我得到了RRR的一般概念。我看过温莎城堡。是生活方式的组成部分解决了这个问题吗?是的,但大多数时候都是间接的。有关温莎的详细信息,请参阅:非常有用,谢谢。我不想深入探讨这个问题,除非发生了一些“神奇的事情”。这是更好的答案——注入的资源需要在容器上进行处理和IDisposable实现。对于这样的简单情况,不需要RRR模式。
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();
}