我有一个包含以下项目的分层应用程序:
- 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(现在我使用统一)。
问题是,在我的 UI 容器中,我只想这样做
unity.RegisterType<IMarketService, MarketService>();
并且不必对存储库也这样做,因为这样 UI 层将依赖于 DAL 层。
我考虑向服务类添加一个无参数构造函数,例如:
public MarketService() : this(new MarketRepository(*What would I put here?)) { }
但是后来我失去了接口提供的抽象,而且我不知道如何处理存储库需要作为参数的 MyContext ;如果我通过一个新的,那么我需要参考 DAL。
我应该更改我的存储库以在构造函数中创建一个新的 MyContext,而不是将其作为参数获取吗?
如何重构我的架构以使其正常工作并具有最小的依赖关系?