C# 注入ViewModel及其属性

C# 注入ViewModel及其属性,c#,silverlight,mvvm,dependency-injection,unity-container,C#,Silverlight,Mvvm,Dependency Injection,Unity Container,我的Silverlight项目中有ViewModel public class MainViewModel : BaseNotify, IMainViewModel { [Dependency("AccountID")] public Guid AccountID { get; set; } ... public MainViewModel() { if (AccountID != Guid.Empty) {

我的Silverlight项目中有ViewModel

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);
    }
}
公共静态类IoC
{
静态IoC()
{
当前=新的UnityContainer();
Current.RegisterType();
}
公共静态UnityContainer当前{get;set;}
}
公共部分类应用程序:应用程序
{
[依赖性]
公共IMainViewModel视图模型{get;set;}
私有void应用程序\u启动(对象发送方、StartupEventArgs e)
{
Guid accountId=“1234-5678-1234-5678-1234”;
IoC.电流.累积(本);
}
}

调用build方法后,我在App.ViewModel中有MainViewModel的实例,但是我如何设置Unity,以便在build过程中为MainViewModel.AccountId属性值注入一些值?

您需要使用一个:


您的代码似乎正在使用。像这样的模式通常更可取

另一个问题:为什么要将MainViewModel与应用程序类连接起来?通常,您会将其用作MainView的DataContext


使用DI容器注入基本值(如GUID)并不常见。

正如@nemesv提到的,您可能需要更改构建方法调用,但这样做,我认为您无法实现所需的功能

问题是,MainViewModel的第一个实例被创建,然后AccountId被传递给它,因此构造函数中的逻辑永远不会为true,例如

if(AccountID != Guid.Empty)
这从来都不是真的。或者,您可以将此逻辑添加到AccountID属性的Setter中,与以下内容内联:

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

protected virtual void OnAccountIdChanged() {
    if(AccountId != Guid.Empty) {
       //do your thing here
    }
}

为什么要注入viewmodel??ViewModel没有行为,所以我看不出有任何理由注入它。如果您要注入viewmodelfactory,我会理解,但在这里它似乎过度使用了依赖注入。@remibourgarel我这样做是为了单元测试的目的。因为应用程序将根据用户角色具有一些不同的业务逻辑。因此,我将创建不同的IMainViewModel接口实现。ViewModel肯定有行为。ViewModel没有行为这不是真的ViewModel是模型和视图之间的桥梁,逻辑在模型中,充其量是映射逻辑,但您真的需要对映射逻辑进行单元测试吗?如果这是因为将有不同的实现,那么您需要的是工厂而不是服务定位器。谢谢,它很有效。但我是这样做的:
Current.RegisterType(新注入构造函数(accountId)).RegisterType()
并将MainViewModel的构造函数更改为传递GUID参数。我确实在应用程序类中连接了,因为我在应用程序中使用非平凡逻辑获取accountID变量(我稍微简化了代码)。实际上,在这之后,我将ViewModel绑定到DataContext:
this.RootVisual=newmainpage{DataContext=ViewModel}谢谢你的回答。我解决了讲师注射的问题。请参阅我对@nemesv的评论
public Guid AccountId {
    get { return _accountId; }
    set {
        _accountId = value;
        OnAccountIdChanged();
    }
}

protected virtual void OnAccountIdChanged() {
    if(AccountId != Guid.Empty) {
       //do your thing here
    }
}