在MVVM Light SimpleIOC中使用带参数的构造函数

3

我刚开始使用mvvm light toolkit中的SimpleIOC。我想知道是否有将带参数构造函数设置为PreferredConstructor的选项?

SimpleIOC是否支持此功能?如果支持,当尝试从容器中解析对象时,如何传递参数?

对于不带参数的构造函数,我可以轻松地实现这一点,例如:

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

但问题是如何为带参数的构造函数实现这一点?
1个回答

3
你需要应用抽象工厂模式。
基本上,你需要创建一个名为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
        );
    }
}

在你的 ViewModel 中,只需要执行以下操作:
public class SomeViewModel
{
    private readonly MyClass myClass;
    public SomeViewModel(IMyClassFactory myClassFactory) 
    {
        myClass = myClassFactory.Create("MyParameter");
    }
}

顺便说一下:不要在IoC中使用Singleton,这有点违背了IoC容器的目的,它只成为了一个简单的ServiceLocator。


谢谢您的回复。但是,IOC基本上不会创建多个对象,这是否足够?当我两次调用myClassFactory.Create(“MyParameter”)时,它不会产生两个不同的对象吗? - Bharathi
不知道SimpleIoC,但在Unity 3中,您也可以覆盖参数。 this.unityContainer.Resolve<MyClass>(new ParameterOverride(“myParameter”,passedParameter));尽管如果该类型之前注册为Singleton,则不会导致新实例。 MyClass需要成为单例的特定原因吗?当然,您还可以在IMyClassFactory中实现自己的缓存机制,并通过参数缓存实例。好处是,这不是ViewModel的问题,并且在MyClassFactory实现中透明地抽象化了它。 - Tseng
你也可以使用命名实例注册(我假设SimpleIoC支持它。Unity3肯定支持),在注册之后,它就是一个IoC关注的问题了。 - Tseng
MyClassFactory应该在构造函数中使用依赖注入获取依赖项,而不是依靠SimpleIoc.Default.GetInstance,因为这样做“违背了IoC容器的初衷”? - Jamby
你也可以这样做。不过这取决于工厂的生命周期和依赖关系。如果工厂的寿命比依赖项长(即容器的生命周期,但您的依赖项是短暂或作用域的),则需要为每个调用创建方法进行解析。在工厂中引用容器是可以的,也是唯一可以使用它们的地方(除了引导程序之外)。工厂实现是应用程序层的一部分,而不是业务/领域层(只有其接口驻留在那里)。 - Tseng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接