Замок: использование существующего (не единственного) экземпляра для зависимости более низкого уровня - PullRequest
1 голос
/ 12 июля 2011

У меня есть примерно такая модель:

public interface IUnitOfWork { }

public class UnitOfWork : IUnitOfWork { }

public interface IService { }

public class Service : IService
{
    public IUnitOfWork UnitOfWork { get; set; }
}

public class ViewModel
{
    public IService Service { get; set; }
}

И конфигурация, которая может быть такой:

container.Register(Component.For<IService>().ImplementedBy<Service>()
                            .LifeStyle.Transient
                   Component.For<IUnitOfWork>().ImplementedBy<UnitOfWork>()
                            .LifeStyle.Transient,
                   Component.For<ViewModel>().LifeStyle.Transient);

Мне нужно разрешить в разных точках два экземпляраViewModel (для этого я использую типизированную фабрику, но для простоты оставим это в стороне и предположим, что я использую необработанный контейнер)

Подвох в том, что мне нужно разрешить два экземпляра ViewModel в разных точках (из другой ViewModel, которая знает об обоих), и им нужно совместно использовать один и тот же IUnitOfWork.

Итак, что-то вроде этого:

var vm1 = container.Resolve<ViewModel>();
//...later
var vm2 = container.Resolve<ViewModel>();

Теперь очень просто поделиться Сервисом .Мне просто нужно сделать что-то вроде:

var vm2 = container.Resolve<ViewModel>(new { vm1.Service });

Но, конечно, реальная модель более сложная (разные модели ViewMode, с большим количеством служб в каждой), так что это не вариант.

Я могу передать UnitOfWork в Resolve, но он не используется по умолчанию (что имеет смысл).Есть ли способ использовать этот параметр (возможно, путем регистрации делегата) при разрешении второго ViewModel?

Я хотел бы иметь возможность сделать следующее:

var vm2 = container.Resolve<ViewModel>(new { UnitOfWork });

И получите ViewModel, у которого Service есть конкретный UnitOfWork.

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Если вам нужно предоставить общий доступ к компоненту, и вы не можете установить его как singleton (расширенный клиент) или perwebrequest, вам нужно использовать контекстный образ жизни. проверить эту тему см. Мой последний комментарий для загрузки Contribute W / Contextual Lifestyle

В вашем случае я предполагаю, что эти 2 ViewModel будут использоваться 1 View ... поэтому для View + UoW требуется контекстный образ жизни

проверьте и этот тоже см. Комментарии в конце

1 голос
/ 13 июля 2011

Решением было использование ContextualLifestyle в сочетании с пользовательской фабрикой, которая сохранила ссылку на ContainerContext, чтобы использовать ту же самую при разрешении другого ViewModel.

...