在 MVVM light SimpleIOC 中调用带参数的构造函数
Invoke constructor with parameter in MVVM light SimpleIOC
我刚开始使用 mvvm light 工具包中的 SimpleIOC。我只是想知道是否可以选择将参数化构造函数作为 PreferredConstructor?
SimpleIOC 是否提供此功能?如果是这样,我将如何在尝试从容器中解析对象时传递参数。
我可以轻松地为无参数构造函数执行此操作,例如-
SimpleIoc.Default.Register<MyClass>();
SimpleIoc.Default.GetInstance<MyClass>().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
);
}
}
然后在您的 ViewModel 中执行
public class SomeViewModel
{
private readonly MyClass myClass;
public SomeViewModel(IMyClassFactory myClassFactory)
{
myClass = myClassFactory.Create("MyParameter");
}
}
旁注:不要将 Singleton 用于 IoC,它在某种程度上违背了 IoC 容器的目的,它变成了一个纯粹的 ServiceLocator。
我刚开始使用 mvvm light 工具包中的 SimpleIOC。我只是想知道是否可以选择将参数化构造函数作为 PreferredConstructor?
SimpleIOC 是否提供此功能?如果是这样,我将如何在尝试从容器中解析对象时传递参数。
我可以轻松地为无参数构造函数执行此操作,例如-
SimpleIoc.Default.Register<MyClass>();
SimpleIoc.Default.GetInstance<MyClass>().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
);
}
}
然后在您的 ViewModel 中执行
public class SomeViewModel
{
private readonly MyClass myClass;
public SomeViewModel(IMyClassFactory myClassFactory)
{
myClass = myClassFactory.Create("MyParameter");
}
}
旁注:不要将 Singleton 用于 IoC,它在某种程度上违背了 IoC 容器的目的,它变成了一个纯粹的 ServiceLocator。