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

和这样的工作单元:

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的 s 并为每个人提供实例IUnitOfWorkIUnitOfWork

4

2 回答 2

0

如果我理解您的问题,只需IUnitOfWork以您在上述示例中注册存储库的相同方式(和相同地点)进行注册。您不需要根据当前设计注册 ViewModel,因为您没有使用接口。

Container.RegisterType<IUnitOfWork, UnitOfWork>();

并继续让您的存储库接受IUnitOfWork构造函数中的 。IUnitOfWork这将允许 Unity 在每次解析存储库时使用构造函数注入来提供一个新实例。默认情况下,您每次都会获得一个新的实例IUnitOfWork。如果您想拥有一个单例IUnitOfWork,则必须在注册时IUnitOfWork这样说:

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

如果您想了解终身经理,您可以在此处进行。

我还建议更改您的 ViewModel 以将存储库作为构造函数参数,如果您要解析它们,就像这样(因此 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_categoryRepository引用相同的 . 实例unitOfWork

于 2012-08-13T08:31:33.883 回答