次のシナリオで私を修正してください。(質問は最後にあります)
(整理されていない同様の質問をしましたが、投票で終了しました。そのため、ここで質問を正確な回答で回答できる範囲にまとめました。)
nhibernate を ORM として使用して、複数のレイヤーを持つ Web アプリケーションを開発しています。私のレイヤー構造は次のとおりです
- モデル層
- リポジトリ層
- サービス層
- UIレイヤー
上記のレイヤーでは、クラスとインターフェイスは次のように配置されます。
ProductController.cs (UI レイヤー)
public class ProductController : Controller
{
ProductServices _ProductServices;
NHibernate.ISession _Session;
public ProductController()
{
_Session = SessionManager.GetCurrentSession();
_ProductServices = new ProductServices(
new ProductRepository(), _Session);
}
// Cont..
}
ProductServices.cs (サービス層)
public class ProductServices : IProductServices
{
protected IProductRepository _ProductRepository;
protected NHibernate.ISession _Session;
public ProductServices(IProductRepository productRepository,
NHibernate.ISession session)
{
_ProductRepository = productRepository;
_Session = session;
_ProductRepository.SetSession(_Session);
}
// cont...
}
ProductRepository.cs (リポジトリ レイヤー)
public class ProductRepository : IProductRepository
{
NHibernate.ISession _Session;
public void SetSession(NHibernate.ISession session)
{
_Session = session;
}
public IEnumerable<Product> FindAll()
{
return _Session.CreateCriteria<Product>().List<Product>();
}
//cont..
}
UI レイヤーから、セッションごとのリクエストとしてセッションを作成し、クラス コンストラクターを使用してサービス レイヤーに挿入します。次に、メソッドを使用してリポジトリのセッションを設定します。
_Session をコンストラクターとしてリポジトリに直接渡すと、サービス層の下でそれを制御できなくなるのではないかと心配しています。また、 Web サービス層を使用するための将来の拡張計画もあります。
**同じコードを繰り返しているため、すべてのメソッド_Session
にコードを書かずに、すでに設定されているProductRepositoryクラスの各メソッドで確認する方法はありますか。if(_Session==null)
** 上記のパターンが間違っている場合は、この目標を達成する正しい方法を教えてください。