C# 在MVVM light SimpleIOC中使用参数调用构造函数

C# 在MVVM light SimpleIOC中使用参数调用构造函数,c#,mvvm,mvvm-light,ioc-container,C#,Mvvm,Mvvm Light,Ioc Container,我刚刚开始使用mvvm light toolkit中的SimpleIOC。我只是想知道是否有一个选项可以使参数化构造函数成为首选构造函数 SimpleIOC是否提供此功能?如果是这样,在尝试从容器解析对象时,我将如何传递参数 我可以很容易地为无参数构造函数这样做- SimpleIoc.Default.Register<MyClass>(); SimpleIoc.Default.GetInstance<MyClass>().MyMethod(); simpleoc.Def

我刚刚开始使用mvvm light toolkit中的SimpleIOC。我只是想知道是否有一个选项可以使参数化构造函数成为首选构造函数

SimpleIOC是否提供此功能?如果是这样,在尝试从容器解析对象时,我将如何传递参数

我可以很容易地为无参数构造函数这样做-

SimpleIoc.Default.Register<MyClass>();
SimpleIoc.Default.GetInstance<MyClass>().MyMethod();
simpleoc.Default.Register();
SimpleIoc.Default.GetInstance().MyMethod();

但是,问题是,对于带参数的构造函数,如何实现这一点?

您需要应用抽象工厂模式

您基本上创建了一个
IMyClassFactory
接口,并在应用程序层实现它。您的类将有
IMyClassFactory
作为依赖项,而不是
MyClass

public interface IMyClassFactory 
{
    // For simplification it returns MyClass. For sake of decoupling, 
    // it should return IMyClass interface which is implemented by MyClass
    MyClass Create(string myParameter);
}

// In your application layer, if you use n-layered architecture
public class MyClassFactory : IMyClassFactory 
{
    public MyClass Create(string myParameter) 
    {
        return new MyClass(
            SimpleIoc.Default.GetInstance<Dependency1>(),
            SimpleIoc.Default.GetInstance<Dependency2>(),
            myParameter
        );
    }
}

另一方面:不要在IoC中使用Singleton,它有点超出了IoC容器的用途,它只是一个ServiceLocator。

感谢您的回复。但是,这是否足以满足“不创建多个对象”的要求(IOC基本上就是这么做的)?当我两次调用myClassFactory.Create(“MyParameter”)时,它不会生成两个不同的对象吗?对于SimpleIoC来说不知道,但是Unity 3也可以重写参数
this.unityContainer.Resolve(新参数覆盖(“myParameter”,passedParameter))不过,如果该类型以前注册为Singleton,则不会产生新实例。MyClass需要是singleton的具体原因是什么?当然,您也可以在IMyClassFactory中实现自己的缓存机制,并通过参数缓存实例。好的是,这与您的ViewModel无关,在MyClassFactory实现中是透明抽象的。您还可以在注册后使用命名实例注册(我假设SimpleIoC支持它。Unity3肯定支持),然后它是一个IoC关注点。MyClassFactory不应该在构造函数中获得依赖项吗,使用依赖注入而不是依赖SimpleIoc.Default.GetInstance,因为这“超出了IoC容器的用途”?你也可以这样做。尽管这有点取决于工厂的生命周期和依赖关系。工厂的使用寿命是否比您的依赖项更长?(即,容器生存期,但依赖项是暂时的或范围有限的)然后需要对create方法的每个调用进行解析。在工厂中引用容器是可以的,也是唯一可以使用它们的地方(在引导程序之外)。工厂实现是应用层的一部分,而不是您的业务/域层(只有它的接口驻留在那里)
public class SomeViewModel
{
    private readonly MyClass myClass;
    public SomeViewModel(IMyClassFactory myClassFactory) 
    {
        myClass = myClassFactory.Create("MyParameter");
    }
}