Внедрить ViewModel и его свойство - PullRequest
3 голосов
/ 24 января 2012

У меня есть ViewModel в моем проекте Silverlight

public class MainViewModel : BaseNotify, IMainViewModel
{
    [Dependency("AccountID")]
    public Guid AccountID { get; set; }
    ...

    public MainViewModel()
    {
        if (AccountID != Guid.Empty)
        {
            PreSelectedAccount = new Account() { ID = AccountID };
            SingleAccountMode = true;
        }
    }
    ....
}

Я использую Unity следующим образом:

public static class IoC
{
    static IoC()
    {
        Current = new UnityContainer();
        Current.RegisterType<IMainViewModel, MainViewModel>();
    }

    public static UnityContainer Current { get; set; }
}

public partial class App : Application
{
    [Dependency]
    public IMainViewModel ViewModel { get;  set; }

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        Guid accountId = "1234-5678-1234-5678-1234";
        IoC.Current.BuildUp(this);
    }
}

После вызова метода BuildUp у меня есть экземпляр MainViewModel в приложении.ViewModel, но как я могу настроить Unity для вставки также некоторого значения для значения свойства MainViewModel.AccountId во время BuildUp?

Ответы [ 3 ]

1 голос
/ 24 января 2012

Вам необходимо разрешить / построить с переопределением :

IoC.Current.BuildUp(this, new PropertyOverride("AccountID", accountId));
0 голосов
/ 24 января 2012

Как уже упоминалось @nemesv, вам может понадобиться изменить вызов метода BuildUp, но я не думаю, что вы сможете достичь того, что вам нужно.

Проблема в том, что сначала создается экземпляр MainViewModel, а затем в него передается AccountId, поэтому ваша логика в конструкторе никогда не верна, например,

if(AccountID != Guid.Empty)

никогда не бывает правдой. В качестве альтернативы вы можете добавить эту логику в Setter свойства AccountID, что-то встроенное в это:

public Guid AccountId {
    get { return _accountId; }
    set {
        _accountId = value;
        OnAccountIdChanged();
    }
}

protected virtual void OnAccountIdChanged() {
    if(AccountId != Guid.Empty) {
       //do your thing here
    }
}
0 голосов
/ 24 января 2012

Ваш код выглядит так, как будто вы используете анти-шаблон ServiceLocator .Наиболее предпочтительным является шаблон типа инжекция в конструктор .

Другой вопрос: почему вы подключаете свою MainViewModel к своему классу приложения?Обычно вы используете его как DataContext для вашего MainView.

И не принято вводить примитивные значения, такие как Guids, используя DI-контейнер.

...