我有一个包含以下项目的分层应用程序:
- 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/