2

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();
    }
}
4

2 に答える 2

3

を定義し、IUnitOfWorkFactoryそれをサービスに挿入します。

public class Service
{
    private readonly IUnitOfWorkFactory factory;

    public Service(IUnitOfWorkFactory factory)
    {
        this.factory = factory;
    }

    public void DoOperation()
    {
        using (UnitOfWork context = this.factory.CreateNew())
        {
            this.DoSomeStuff(context);
            this.DoMoreStuff(context);

            context.SubmitChanges();
        }
    }
}
于 2011-03-07T22:08:35.313 に答える
0

あなたがする必要があると思うのは、作業単位ファクトリーを定義することです。このファクトリーを DI コンテナーに登録し、作業単位が必要になるたびにこのファクトリーを解決します。次に、工場から作業単位を取得し、それを操作して手放します。単一のメソッドまたは単一のクラスのスコープ内で作業単位が必要になることがよくあります。この記事では、Entity Framework に関連する Unit of Work パターンについて説明します: http://msdn.microsoft.com/en-us/magazine/dd882510.aspx

于 2011-03-11T12:04:35.503 に答える