【问题标题】:Invoke constructor with parameter in MVVM light SimpleIOC在 MVVM light SimpleIOC 中使用参数调用构造函数
【发布时间】:2015-04-04 01:27:26
【问题描述】:

我刚刚开始使用 mvvm light 工具包中的 SimpleIOC。我只是想知道是否可以选择将参数化构造函数作为 PreferredConstructor?

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

我可以轻松地为无参数构造函数执行此操作 -

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

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

【问题讨论】:

    标签: c# mvvm mvvm-light ioc-container


    【解决方案1】:

    您需要应用抽象工厂模式。

    你基本上创建了一个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");
        }
    }
    

    附带说明:不要将 Singleton 用于 IoC,它在某种程度上超出了 IoC 容器的目的,它变成了一个单纯的 ServiceLocator。

    【讨论】:

    • 感谢您的回复。但是,这是否足以满足国际奥委会非常基本的“不创建多个对象”?当我调用 myClassFactory.Create("MyParameter") 两次时,它不会产生两个不同的对象吗?
    • 不知道 SimpleIoC,但 Unity 3 你也可以覆盖参数。 this.unityContainer.Resolve&lt;MyClass&gt;( new ParameterOverride("myParameter", passedParameter)); 虽然如果该类型之前注册为 Singleton,则不会产生新实例。 MyClass 需要单例的任何具体原因?当然,您也可以在 IMyClassFactory 中实现自己的缓存机制,并通过参数缓存实例。好消息是,这与您的 ViewModel 无关,并且在 MyClassFactory 实现中透明地抽象出来。
    • 你也可以在注册后使用命名实例注册(我假设 SimpleIoC 支持它。Unity3 肯定支持),那么这是一个 IoC 问题
    • 不应该 MyClassFactory 在构造函数中获取依赖项,使用依赖注入而不是依赖 SimpleIoc.Default.GetInstance,因为这“超出了 IoC 容器的目的”?
    • 你也可以这样做。尽管它在一定程度上取决于您工厂的生命周期和依赖关系。工厂的生命周期是否比您的依赖项更长? (即容器生命周期,但您的依赖项是瞬态的或作用域的)然后您需要为每次调用 create 方法进行解析。在工厂中引用容器是可以的,也是唯一可以使用它们的地方(在引导程序之外)。工厂实现是应用层的一部分,而不是您的业务/领域层(它的唯一接口驻留在那里)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    相关资源
    最近更新 更多