首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用DI/抽象工厂模式时依赖关系的处理

使用DI/抽象工厂模式时依赖关系的处理
EN

Stack Overflow用户
提问于 2012-06-28 09:57:29
回答 1查看 798关注 0票数 3

在下面的简化示例中,我有一个DataContext和Repository,我认为它是以相当合理的方式定义的:

代码语言:javascript
运行
复制
public interface IUnitOfWork 
{
   int SaveChanges();
}

public class DataContext : DbContext, IUnitOfWork 
{
    public DbSet<Car> Cars { get ; set; }
}

public interface ICarsRepository 
{
    Car Find(int id);
    void Add(Car car);
}

public class SqlCarsRepository : ICarsRepository 
{
    private DataContext  _context;
    public SqlCarsRepository(DataContext context)
    {
       _context = context;
    }

    public Car Find(int id) 
    {
        return _context.Cars.Find(id);
    }

    //etc
}

我很难找到如何使用DI和抽象工厂模式来实现我想要的结果。在MVC应用程序中,这很容易设置-- Controller需要在其构造函数中实现IUnitOfWork和ICarsRepository的实例。我可以配置容器,使用不同的控制器工厂,为每个Http请求提供相同的DataContext实例。在这里,似乎正确地处理了一次性依赖项。

但是,我希望在windows服务中使用相同的存储库。这是多线程的,每个线程启动时都需要访问自己的存储库,每个线程都应该有自己的DataContext / UnitOfWork。但我不知道该怎么做

  • 应用程序的复合根目录是服务启动时,因此不能解决每个线程的依赖关系(线程是根据需要启动的)。
  • 我不知道如何使用抽象的工厂模式。线程需要IUnitOfWork和ICarsRepository的实例,但共享相同的DataContext。我可以创建一个抽象工厂,在一个调用中创建这两个函数,并将其传递到线程中,但是我不知道如何处理DataContext。我不希望线程关心对ICarsRepository实现的依赖关系,它是一次性的。我绝对不想让线程知道ICarsRepository对DataContext有一个依赖关系,因为有一个接口似乎毫无意义--线程可能只是依赖于SqlCarsRespository。
  • 我不想让SqlCarsRepository是一次性的,让它释放DataContext,因为可能会有其他人使用DataContext,而且它一开始就没有创建它。
  • 我想我可以创建一个CarsService来隐藏IUnitOfWork和ICarsRepository (并使用抽象工厂获取实例),但是我仍然不知道如何处理DataContext依赖项

做我想做的事最好的方法是什么?

EN

Stack Overflow用户

回答已采纳

发布于 2012-06-28 11:24:23

因此,不能为每个线程解析依赖关系。

他们可以,事实上,他们应该。您应该在每个线程的开头解析一个新的对象图。不这样做,意味着您只能使用线程安全的依赖项,这在您的情况下不是这样的。

我不知道如何使用抽象的工厂模式

我认为,首先,尝试将DataContext定义为MVC应用程序中的Web请求和windows服务中的生存期范围(或您使用的容器中的任何可用内容)。在windows服务中,每个线程都将获得自己的生存期范围。定义作用域通常允许在作用域结束时释放实例。

我不希望线程关心对ICarsRepository实现的依赖--它是一次性的

您的线程应该关心这个问题,但是您的业务逻辑不应该关心这个问题。在启动新线程时,您必须有一些基础结构代码,允许启动和结束一个范围,以及解析和使用图形的根类型。这段代码应该是组合根的一部分,所以应用程序的其他部分应该忽略这一点。如果您用每个生命周期范围(或其他一些显式生存期)注册了某些类型,则容器将知道何时释放这些实例。基础结构代码只需告诉容器范围已经结束。

我不想让SqlCarsRepository变成一次性的

SqlCarsRepository应该依赖于一个不实现IDisposable的接口,在这种情况下没有什么可处理的。它应该是负责处理DataContext的容器,通过适当的注册,您可以这样做。

做我想做的事最好的方法是什么?

您的设计听起来是合理的,但是这里还有一些其他的问题,这可能会给您提供更多的工作:

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11242166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档