1

これは、ここに投稿された質問に関連しています。私のコアプロジェクトには次のものがあります。

public interface IRepository<T> : IDisposable  
{  
    IQueryable<T> All { get; }  
    IQueryable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties);  
    TEntity Find(int id);  
    void InsertOrUpdate(T entity);  
    void Delete(int id);  
    void Save();  
}  

public class Customer  
{  
    public int Id { get; set; }  
    public string FirstName { get; set; }  
    public string LastName { get; set; }   
} 

DAL には CustomerContext と CustomerRepository があります。このプロジェクトは Entity Framework に依存しています。

public class CustomerContext : DbContext
{
    public DbSet<Customer> Customers { get; set; }
}

public class CustomerRepository : IRepository<Customer>
{

}

次は私のBALです。これはクラス ライブラリ プロジェクトです。顧客リポジトリでいくつかのアクションを実行する必要がありますが、DAL への依存関係を直接追加せずに実行したいと考えています。ninjectを使用してDI経由でやろうとしています。IRepository と CustomerRepository の間のバインディングを次のように設定しています。

var Kernel = new StandardKernel();  
Kernel.Bind<IRepository>().To<CustomerRepository>();  
  1. BAL から何らかの API を呼び出す UI アプリケーションがあるとします。IRepository を CustomerRepository にバインドするための上記のコードは、どこに配置する必要がありますか? App.config を介してこのバインドを行う方法はありますか?

  2. これを BAL のどこかに置くとわかるように、DAL レイヤーで定義されている CustomerRepository を使用しているため、DAL プロジェクトへの参照を追加する必要があります。

4

2 に答える 2

4

まず第一に: を公開する一般的なリポジトリを使用しないでくださいIQueryable<TEntity>

  1. 単体テストを書くときにそれらをモックしようとしましたか?
  2. それらは、漏れやすい抽象化と呼ばれるものです。

あなたの質問:

BAL から何らかの API を呼び出す UI アプリケーションがあるとします。IRepository を CustomerRepository にバインドするための上記のコードは、どこに配置する必要がありますか? App.config を介してこのバインドを行う方法はありますか?

UI プロジェクトから DAL に依存関係を追加できないのはなぜですか? また、プロジェクトを公開したり、セットアップ パッケージを作成したりすると、DAL が自動的に含まれるため、インストールも簡素化されます。

これを BAL のどこかに置くとわかるように、DAL レイヤーで定義されている CustomerRepository を使用しているため、DAL プロジェクトへの参照を追加する必要があります。

BAL に参照または構成を作成しないでください。ルートとなるUIプロジェクトです。したがって、任意の構成をそれに追加する必要があります。

私は通常、すべてのプロジェクトで構成ルートを作成し、スタートアップ プロジェクトからすべてのアセンブリでルートを呼び出します。つまり、スタートアップ プロジェクトは、どのプロジェクトを取得したかを知る必要があるだけで、それらに何が含まれているかを知る必要はありません。

于 2012-09-24T06:43:10.127 に答える
3

コンテナを低レベルのレイヤーに設定することはありません。むしろ、階層のどこかにコンポジションルートがあります。デスクトップアプリケーションの場合は、Mainが適切な候補です。Webアプリケーションでは、Global.asax'sになりApplication_Startます。

于 2012-09-23T19:04:41.330 に答える