Имейте зависящее от модуля Инъекцию для Государства в приложении PRISM WPF - PullRequest
0 голосов
/ 10 августа 2011

Привет, у нас есть приложение PRISM WPF MVP, мы хотели бы иметь состояние для обмена данными между представлениями в одном модуле. Так как PRISM по умолчанию не имеет состояния, мне было интересно, есть ли способ, которым я мог бы реализовать это. В настоящее время я внедрил состояние с помощью словаря в качестве бэк-хранилища, но проблема в том, что он доступен в глобальных модулях. я действительно хотел бы охватить эту инъекцию, являющуюся определенным модулем.

Я полагаю, что Unity позволяет регистрировать разные классы в одном и том же интерфейсе по имени, но не уверен, что единственный выбор, который у меня есть, - это использовать его для моего сценария.

Любая помощь будет отличной! Спасибо!

-ioWint

Ответы [ 3 ]

0 голосов
/ 11 августа 2011

Внедрить локальный (на уровне модуля) объект состояния во все представления, которые хотят иметь общее состояние.Если интерфейс, который определяет объект состояния, является локальным для вашего модуля, то другие модули не смогут ссылаться на объект состояния, потому что они не могут ссылаться на интерфейс.

Итак: если модуль A имеет 3 представления,возьмите объект, реализующий IStatefulContainer (также объявленный в модуле A), и IStatefulContainer зарегистрирован в Unity с использованием RegisterInstance, а не просто RegisterType, у которого будет синглтон, ограниченный для модуля.«Государственная» служба, которая управляла государством.Это может позволить вам добавить больше функциональности, если вам это нужно, и является более «призменным» подходом.

EDIT


Если вы используете этот объект состояния в разных модулях,может сделать следующее:

1) Поместить интерфейс в сборку, на которую будет ссылаться любой модуль, который хочет его использовать.

Сборка A

public interface IBlah
{
    string Add(string stateKey, string stateValue);
}





Assembly B (referencing Assembly A)



    public class Module:IModule
    {
    private IUnityContainer _container;

        public Module(IUnityContainer container)
        {
            _container=container;
        }
        public void Initialize()
        {
            IBlah blah1=new BlahContainer();
            IBlah blah2=new BlahContainer();
            _container.RegisterInstance<IBlah>(blah1,"BlahContainer1");
            _container.RegisterInstance<IBlah>(blah2,"BlahContainer2");

        }
    }

МодульC (ссылка на сборку A)

_container.Resolve<IBlah>("BlahContainer1");
_container.Resolve<IBlah>("BlahContainer2");

По сути, мы определяем интерфейс в сборке, которой мы рады поделиться между модулями.У некоторых проектов есть «Инфраструктура» или Общие сборки, которые содержат сервисные интерфейсы, которые используются другими модулями - здесь это будет хорошо соответствовать.

Затем наш модуль ссылается на сборку с контрактом в нем.

В данный момент я полагаюсь на «магические струны», но есть много способов обойти это.

Надеюсь, это немного яснее.

0 голосов
/ 16 августа 2011

спасибо за ваше обновленное решение.Я пытался избежать регистрации в Unity, основанной на имени, что заставило бы моего докладчика узнать регистрационный ключ модуля.Я читал сообщения stackoverflow по Unity и нашел обсуждение здесь Можно ли переопределить значения параметров при использовании метода Injection with Unity? .

После нескольких часов проб и ошибок я получил желаемую функциональность.

Что я сделал:

У меня есть BaseClass для моих модулей -> BaseModule: IModule У меня есть свойство State, которое соответствует моему IStateService, определенному в Infrastructure.Interface.Я использую это свойство State в конструкторе BaseModule ().Примечание: чтобы использовать этот подход, я должен сделать так, чтобы у моего докладчика было общедоступное состояние IStateService;свойство ..

Во время регистрации Presenter в модуле я указываю

<UnityContainer>.RegisterType<MyPresenter, new InjectionProperty("State", State).

Переопределяю публичное свойство в Presenter с именем «State» значением экземпляра State.определено в модуле.таким образом, я могу получить состояние модулей в качестве состояния для каждого докладчика представления.

Спасибо, ребята, за то, что направили меня к решению.

-ioWint

0 голосов
/ 10 августа 2011

Я бы согласился, с чего можно начать регистрацию типов Unity с помощью ModuleName.

...