Внедрение в конструктор ObjectContext с использованием Unity / Prism / MVVM - PullRequest
3 голосов
/ 08 сентября 2010

Я разрабатываю приложение, используя WPF с шаблоном MVVM и Prism.Представления добавляются в ModuleCatalog, а модели представлений регистрируются в едином контейнере.Для этого я использую Bootstrapper, который отвечает за создание оболочки, настройку контейнера Unity и каталога модулей.
Теперь вопрос в том, как внедрить мой EntityContext в несколько моделей представления.
Сначала Bootstrapper:

 
public class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            Shell shell = Container.Resolve();
            shell.Show();
            return shell;
        }</p>

<pre><code>    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();
        Container.RegisterType<EntityContext >("Context");
        Container.RegisterType<PersonViewModel>(new InjectionConstructor(
            new ResolvedParameter<EntityContext >("Context")));
    }

    protected override IModuleCatalog GetModuleCatalog()
    {
        ModuleCatalog catalog = new ModuleCatalog();
        catalog.AddModule(typeof(PersonModule));
        return catalog;
    }

Видовая модель выглядит так (отрывок)


public class PersonViewModel : ViewModelBase, IDataErrorInfo
    {
        private Person _person;
        private PersonRepository _repository;
        readonly EntityContext _context;</p>

<pre><code>    public PersonViewModel(EntityContext context)
    {
        _context = context;
        _person = new Person();
        _repository = new PersonRepository(context);
    }

Модуль:


    public class PersonModule : IModule
    {
        private readonly IRegionManager regionManager;</p>

<pre><code>    public PersonModule(IRegionManager regionManager)
    {
        this.regionManager = regionManager;
    }

    public void Initialize()
    {
        regionManager.RegisterViewWithRegion("PersonData", typeof(PersonView));
    }

}

Кодовое представление представления:


    public partial class PersonView : UserControl
    {
        private PersonViewModel _vm;</p>

<pre><code>    public PersonView()
    {
        InitializeComponent();
    }

    [Dependency]
    public PersonViewModel VM
    {
        get
        {
            return this.DataContext as PersonViewModel;
        }
        set
        {
            _vm = value;
            this.DataContext = _vm;
        }
    }      
}

Я не уверен, работает ли мой подход в принципе, норади сохранения изменений в базе данных мне нужен мой контекст в знании изменений, внесенных в нее.Сейчас он явно не работает, потому что возникает ModuleInitializeException .Stacktrace:
Возникла исключительная ситуация при инициализации модуля «PersonModule».
- Сообщение об исключительной ситуации: произошла исключительная ситуация при попытке добавить представление в область «PersonData».
- Наиболее вероятная причина былаwas: 'System.InvalidOperationException: тип EntityContext имеет несколько конструкторов длины 1. Невозможно устранить неоднозначность.
bei Microsoft.Practices.ObjectBuilder2.ConstructorSelectorPolicyBase 1.FindLongestConstructor(Type typeToConstruct)<br> bei Microsoft.Practices.ObjectBuilder2.ConstructorSelectorPolicyBase 1.SelectConstructor (контекст IBuilderContext)
bei Microsoft.Pract.ObjectBuilder2.DynamicMethodConstructorStrategy.PreBuildUp (контекст IBuilderContext)
bei Microsoft.Practices.ObjectBuilder2.StrategyChain.- Сборка, из которой модуль пытался загрузить модуль, была следующей: App, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null
Проверьте свойство InnerException исключения для получения дополнительной информации.Если во время создания объекта в DI-контейнере возникла исключительная ситуация, вы можете включить исключение. GetRootException () поможет найти основную причину проблемы.

Если есть другие решения для этой проблемы, я открыт для нее, но я хочу использовать представленную базовую структуру более или менее.
Заранее спасибо.

1 Ответ

5 голосов
/ 09 сентября 2010

Вы должны настроить контейнер для устранения неоднозначности построения EntityContext:

Container.RegisterType<EntityContext >("Context", new InjectionConstructor(...))
...