gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:48 25 4
gpt4 key购买 nike

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

  • 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com