Unity、POCO クラスを備えたエンティティ フレームワーク 4、DAL 用のリポジトリ パターン、およびビジネス ロジック コントロール用のサービスを使用しています。また、Unit of Work を使用して、さまざまなサービスで実行する CRUD 操作をまとめてパッケージ化し、それらをまとめてコミットできるようにしたいと考えています。
私の質問は、Unit Of Work メカニズムを Microsoft Unity を使用してアプリケーションに挿入する適切な方法は何でしょうか? IUnitOfWork をリポジトリと一緒に適切なサービスのコンストラクターに配置できることを理解しています。Unity マッピングが指定されている場合、適切なインスタンスが自動的に開始されますが、この方法ではグローバルな作業単位を渡すのではなく、これは賢明な方法ではありません (実際には、リポジトリはサービスの前でも開始されます)。
私は何が欠けていますか?(私が今書いたように、サービスとそのリポジトリのコンストラクターコードが添付されています)。
また、Unity の ParameterOverrides メソッドを使用して Unit of Work のグローバル インスタンス (たとえば aspx.cs ファイルから) を取得し、それをサービスに渡してからリポジトリに渡すことができることも理解しています。しかし、それは少し不自由なようです。これは私の唯一のオプションですか?
ありがとう
public class GenericRepository<T> : IUnitOfWorkRepository, IGenericRepository<T> where T : BaseEntity, IAggregateRoot
{
private IUnitOfWork _uow;
/// <summary>
/// Returns the active object context
/// </summary>
private ObjectContext ObjectContext
{
get
{
return ObjectContextManager.GetObjectContext();
}
}
public GenericRepository(IUnitOfWork uow)
{
_uow = uow;
}
//blahhhh...
public void Add(T entity)
{
_uow.RegisterNew(entity, this);
}
public void Delete(T entity)
{
_uow.RegisterRemoved(entity, this);
}
//.....blah blah....
public void PersistCreationOf(IAggregateRoot entity)
{
this.ObjectContext.AddObject(GetEntitySetName(), entity);
}
public void PersistUpdateOf(IAggregateRoot entity)
{
// Do nothing as EF tracks changes
}
public void PersistDeletionOf(IAggregateRoot entity)
{
this.ObjectContext.DeleteObject(entity);
}
}
public class CategoryRepository : GenericRepository<XComSolutions.FB.Domain.Model.Entities.Category>, ICategoryRepository
{
public CategoryRepository(IUnitOfWork uow)
: base(uow)
{ }
}
public class CategoryService : ICategoryService
{
public int myID {get; set;}
private ICategoryRepository _categoryRepository;
private IUnitOfWork _uow;
public CategoryService(ICategoryRepository categoryRepository,
IUnitOfWork uow)
{
_categoryRepository = categoryRepository;
_uow = uow;
}
public List<Category> GetAll()
{
return _categoryRepository.GetAll();
}
}