c# - DI 与存储库和服务在不同的 DLL 中,保持关注点分离

标签 c# architecture dependency-injection unity-container repository-pattern

我有一个包含以下项目的分层应用程序:

  • DAL(将 EntityFramework 与存储库结合使用)
  • DAL.Model(包含实体,并被所有其他实体引用)
  • 服务
  • 用户界面(在 wpf 中)

基本存储库如下所示:

public abstract class RepositoryBase<T> where T : class
{
    private readonly MyContext context;
    private readonly IDbSet<T> dbSet;

    protected RepositoryBase(MyContext dataContext)
    {
        context = dataContext;
        dbSet = context.Set<T>();
    }

    protected MyContext Context
    {
        get { return context; }
    }

    **And a series of virtual methods for Add, Delete, etc.
}

所有存储库都扩展了这个,例如:

public class MarketRepository : RepositoryBase<Market>
{
    public MarketRepository(MyContext dataContext) : base(dataContext)
    {

    }

    public IEnumerable<Market> GetAllMarkets()
    {
        return this.Context.Markets.ToList<Market>();
    }
}

服务看起来像这样:

public class MarketService
{
    IMarketRepository _marketRepository;

    public MarketService(IMarketRepository marketRepository)
    {
        _marketRepository = marketRepository;
    }

    public IEnumerable<Market> GetAllMarkets()
    {
        return _marketRepository.GetAllMarkets();
    }
}

我想要实现的是,UI 层将仅引用服务层,服务层仅与 DAL 层(以及所有模型,实体所在的模型)使用 DI(现在我正在使用 Unity)。

问题是,在我的 UI 容器中我只想这样做

unity.RegisterType<IMarketService, MarketService>();

并且不必对存储库也这样做,因为这样 UI 层就会依赖于 DAL 层。

我考虑过向服务类添加无参数构造函数,例如:

public MarketService() : this(new MarketRepository(*What would I put here?)) { }

但是我失去了接口(interface)提供的抽象,而且我也不知道如何处理存储库需要的 MyContext 作为参数;如果我通过了一个新的,那么我需要引用 DAL。

我是否应该更改我的存储库以在构造函数中创建一个新的 MyContext,而不是将其作为参数获取?

我如何重构我的架构以使其正常工作并且依赖性最小?

最佳答案

好吧,我相信在更高级别的应用程序中配置依赖项取决于 Bootstrap 。由于它通常是 UI 项目,如果它需要引用其他程序集,那就这样吧。如果您不喜欢您的 UI 项目管理它,那么创建一个 Bootstrap 项目负责让您的应用程序运行并将您的 UI 类分离到另一个项目中。

关于c# - DI 与存储库和服务在不同的 DLL 中,保持关注点分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13512098/

相关文章:

c# - 如何从二进制数组作为资源在 C# 中将程序集加载并执行到内存中

c# - 是否可以在 asp.net 中更改 Page_Load 上的网页 url?

android - Dagger Hilt 错误注入(inject) ActivityContext

javascript - AngularJS 在运行时覆盖依赖

C# WPF 按钮点击

c# - 动态添加按钮到面板

Android MVVM Livedata 最佳实践

java - DDD - java 9 模块项目组织

REST 操作和 URL API 设计注意事项

java - 使用依赖注入(inject)实现数据访问 API