次のセクションでn層アプリケーションを作成しています。
- MyApp.DAL-データアクセス層(EF 5、SQLバックエンド)
- MyApp.BLL-ビジネスレイヤー
- MyApp.WcfService-サービスレイヤー
- MyApp.WpfClient-フロントエンド
- MyApp.Modelsは、すべてのPOCOを保持する共有プロジェクトです。
各レイヤーの「Country」エンティティの例を示します。最初はモデルです。StatefulObjectは、切断されたクライアントからのエンティティの状態を追跡するのに役立つことに注意してください(JuliaLernerのプログラミングEF第2版第18章による)。
public class Country : StatefulObject
{
[Key]
[StringLength(2)]
public string Code { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }
}
DALには、ICountryRepository(基本的なCRUD)とCountryRepositoryがあります。これがコンストラクターです。
public class CountryRepository : ICountryRepository, IDisposable
{
MyDbContext _db;
public CountryRepository()
{
_db = new MyDbContext();
}
//Implement ICountryRepository (basically CRUD), etc...
}
私のBLLには、次のようなICountryLogic、CountryLogic、IBusinessLayer、およびBusinessLayerがあります。
public class CountryLogic : ICountryLogic
{
ICountryRepository _countryRepository;
public CountryLogic(ICountryRepository countryRepository)
{
_countryRepository = countryRepository;
}
//implement ICountryLogic members, etc...
}
public class BusinessLayer : IBusinessLayer
{
public ICountryLogic CountryLogic { get; set; }
public BusinessLayer()
{
CountryLogic = new CountryLogic(new CountryRepository());
}
}
次に、新しいビジネスレイヤーをインスタンス化し、次のような操作を実行するサービスメソッドの例を示します。
public class CountryService : ICountryService
{
public IEnumerable<Country> GetAll()
{
IBusinessLayer bl = new BusinessLayer();
return bl.CountryLogic.GetAll();
}
//implement other service operations
}
次に、WPFクライアントは次のようにサービスを使用できます。
CountryServiceClient countryService = new CountryServiceClient();
var countries = countryService.GetAll();
さて、BLLとWPFフロントエンドの間にWCFサービスを配置する前に、私のWPFフロントエンドは依存性注入を使用することができ、この醜さはありませんでした。
public class BusinessLayer : IBusinessLayer
{
public ICountryLogic CountryLogic { get; set; }
public BusinessLayer()
{
CountryLogic = new CountryLogic(new CountryRepository()); // <<<< UGLY HERE
}
}
代わりに、次のようにDIとコンストラクターインジェクションを使用します。
public class BusinessLayer : IBusinessLayer
{
public ICountryLogic CountryLogic { get; set; }
public BusinessLayer(ICountryLogic countryLogic)
{
CountryLogic = countryLogic;
}
}
次に、インターフェイスと実装をWPFのコンテナーに登録するだけです。私の質問は、それらをクラスライブラリ(BLL内)に登録するにはどうすればよいですか?クラスライブラリにはコンポジションルートまたはエントリポイントがないため、その方法がわかりません。SimpleInjectorを使用しています。
または、WcfサービスでDIを使用することもできますが、ICountryRepositoryをCountryRepositoryに登録できるように、サービスにDALへの参照が必要になります。これは正しくないようです。サービスレイヤーはBLLのみを参照する必要があるため、BLLにDIを設定する必要があります。ありがとう。