0

次のようなリポジトリがたくさんあります。

public class PersonRepository : IPersonRepository
{
    private readonly IUnitOfWork _unitOfWork;

    public PersonRepository(IUnitOfWork instance)
    {
        _unitOfWork = instance;
    }

    //Remove, Get methods...
    public void Add(Person p)
    {
        _unitOfWork.Context.People.Add(p);
    }
}

および次のような Unit of work クラス:

public class UnitOfWork : IUnitOfWork, IDisposable
{
    public UnitOfWork(){ }

    private readonly HezarehContext _context = new HezarehContext();
    public HezarehContext Context
    {
        get
        {
            return _context;
        }
    }

    public int Save()
    {
        return _context.SaveChanges();
    }

    public void Initialize()
    {
        Context.Database.Initialize(false);
    }

    #region IDisposable Members

    public void Dispose()
    {
        _context.Dispose();
    }

    #endregion
}

今、私は ViewModels が解決されるたびに、新しいIUnitOfWorkインスタンス化が必要です。私のViewModelのほとんどは次のようなものです:

public class PeopleMainViewModel : NotificationObject
{
    // both of repositories must have same instance of IUnitOfWork
    private readonly IPersonRepository _personRepository = ServiceLocator.Current.GetService<IPersonRepository>();
    private readonly ICategoryRepository _categoryRepository = ServiceLocator.Current.GetService<ICategoryRepository>();

    public PeopleMainViewModel()
    {
        InitializeView();
    }

    // add, edit, remove commands ...
}

ViewModels は常に次のように Unity Container を使用して解決されます。

Container.RegisterType<IPersonRepository, PersonRepository>();
// resolve in InjectionProperty...
Container.RegisterType<Object, PeopleMainView>("PeopleMainView", new InjectionProperty(PeopleMainView.DataContextProperty.Name, Container.Resolve<PeopleMainViewModel>();

そして私の質問は、どのように、どこでViewModel自分のを登録し、IUnitOfWorkそれぞれIUnitOfWorkのインスタンスを作成するのですか?

4

2 に答える 2

0

私があなたの質問を理解した場合IUnitOfWorkは、上記の例でリポジトリを登録するのと同じ方法(および同じ場所)で登録してください。インターフェイスを使用していないため、現在のデザインに基づいてViewModelを登録する必要はありません。

Container.RegisterType<IUnitOfWork, UnitOfWork>();

そして、引き続きリポジトリーIUnitOfWorkにコンストラクターでを受け入れさせます。これにより、Unityはコンストラクターインジェクションを使用してIUnitOfWork、リポジトリーを解決するたびに新しいインスタンスを提供できるようになります。デフォルトでは、IUnitOfWork毎回の新しいインスタンスを取得します。シングルトンが必要な場合は、次のようIUnitOfWorkに登録するときにそのように言う必要がありますIUnitOfWork

Container.RegisterType<IUnitOfWork, UnitOfWork>(new ContainerControlledLifetimeManager());

Lifetime Managersについて詳しく知りたい場合は、ここで確認できます。

また、ViewModelsを変更して、リポジトリーをコンストラクターパラメーターとして取り込むことをお勧めします。これは、リポジトリーを解決する場合のようになります(したがって、UnityはServiceLocator直接参照しなくても作業を行います) 。

public PeopleMainViewModel(IPersonRepository personRepo, ICategoryRepository categoryRepo)
{
...
}
于 2012-08-12T14:11:08.433 に答える
0

更新: unity.codeplex ディスカッション に別の解決策があります。

私は最終的に解決策を見つけました。Unityコンテナには、解決中にパラメータを渡すことができる機能がありますType。ViewModels のコンストラクターを次のように変更します。

public class PeopleMainViewModel : NotificationObject
{
    private readonly IPersonRepository _personRepository = null;
    private readonly ICategoryRepository _categoryRepository = null;

    public PeopleMainViewModel(IUnityContainer container, IUnitOfWork unitOfWork)
    {
        // now both of repositories have same instance of IUnitOfWork
        _personRepository = container.Resolve<IPersonRepository>(new ParameterOverride("unitOfWork", unitOfWork));
        _categoryRepository = container.Resolve<ICategoryRepository>(new ParameterOverride("unitOfWork", unitOfWork));
        InitializeView();
    }

    // add, edit, remove commands ...
}

問題が解決しました。の同じインスタンスを参照して_personReposiotryいます。_categoryRepositoryunitOfWork

于 2012-08-13T08:31:33.883 に答える