2

次のプロジェクトを含む階層化されたアプリケーションがあります。

  • 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を作成する必要がありますか?

アーキテクチャをリファクタリングして、最小限の依存関係で適切に機能させるにはどうすればよいですか?

4

4 に答える 4

1

まあ、私は、アプリケーションのより高いレベルで依存関係を構成するのはブートストラッパー次第だと信じています。通常はUIプロジェクトであるため、他のアセンブリを参照する必要がある場合は、そうしてください。UIプロジェクトでそれを管理するのが気に入らない場合は、アプリの実行を担当するブートストラッパープロジェクトを作成し、UIクラスを別のクラスに分離します。

于 2012-11-22T11:52:51.833 に答える
0

インスタンスを作成するときにパラメータとして外部依存関係を追加するのが方法です。
依存関係が解決されるように、Unityを構成するさまざまな方法をよく理解しておく必要があると思います。
依存性注入フレームワークを使用するときにリポジトリを作成する理由を詳しく説明してください。

于 2012-11-22T12:04:22.513 に答える
0

IoCコンテナは、外部構成ファイルの文字列を使用した依存性注入をサポートする必要があります。このようにして、マッピングをハードコーディングする必要はありません。Structuremapはこれを非常にうまく行うので、他のIoCもそうなると確信しています。

于 2012-11-22T11:54:52.617 に答える
0

DIを構成するときは、同じパターンに従う必要があります。UIブートストラッパーはサービスを初期化し、サービスはDALを初期化します。(autofacまたはninjectを使用すると、モジュールを使用してこれを達成できます。単一性を使用すると、モジュールをエミュレートする必要があります)。

擬似コードでは

//ui
void UILayer.ConfigureUnity(unity)
{
    ServiceLayer.ConfigureUnity(unity)
}
//services
void ServiceLayer.ConfigureUnity(unity)
{
    DAL.ConfigureUnity(unity)
    unity.RegisterType<IMarketService, MarketService>();

}
//dal
void DAL.ConfigureUnity(unity)
{
    unity.RegisterType<IMarketRepository, MarketRespository>();
    unity.RegisterType<MyContext, MyContext>(); //not sure exact syntax - just register type for 'new Type()' activator.
}
于 2012-11-25T07:42:10.343 に答える