次のプロジェクトを含む階層化されたアプリケーションがあります。
- DAL(リポジトリでEntityFrameworkを使用)
- DAL.Model(エンティティを含み、他のすべてのエンティティによって参照されます)
- サービス
- UI(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レイヤーに依存するため、リポジトリに対しても同様に行う必要はありません。
次のように、パラメーターなしのコンストラクターをServiceクラスに追加することを考えました。
public MarketService() : this(new MarketRepository(*What would I put here?)) { }
しかし、その後、インターフェイスが提供する抽象化を失い、リポジトリがパラメータとして必要とするMyContextをどう処理するかもわかりません。新しいものを渡す場合は、DALを参照する必要があります。
リポジトリを変更して、パラメーターとして取得するのではなく、コンストラクターに新しいMyContextを作成する必要がありますか?
アーキテクチャをリファクタリングして、最小限の依存関係で適切に機能させるにはどうすればよいですか?