如何使用依赖注入构造函数注册 class? (SimpleIoC)
How to register a class with a dependency injected constructor? (SimpleIoC)
我在我的项目中使用 MVVM Light,但我不确定如何在 ViewModelLocator class 中注册一个 Viewmodel class,它在其构造函数中接受一个参数。
我查看了 docs on IoC 但没有看到任何与使用依赖注入构造函数注册 class 有关的内容,即接受参数。
在我要注册的 class 中,构造函数在其参数中采用一个列表,如下所示:
public ViewSubjectGradeViewModel(IEnumerable<ScoreModel> addedSubjectGradePairs)
但是当我执行到 ViewModel class 的导航时,我得到一个 ActivationException,详细信息:
"Microsoft.Practices.ServiceLocation.ActivationException 未被用户代码处理
HResult=-2146233088
Message=无法注册:在 ViewSubjectGradeViewModel 中找到多个构造函数,但 none 标有 PreferredConstructor。
来源=GalaSoft.MvvmLight.Extras
堆栈跟踪:
在 GalaSoft.MvvmLight.Ioc.SimpleIoc.GetPreferredConstructorInfo(IEnumerable`1 constructorInfos,键入 resolveTo)
在 GalaSoft.MvvmLight.Ioc.SimpleIoc.GetConstructorInfo(输入服务类型)
在 GalaSoft.MvvmLight.Ioc.SimpleIoc.Register[TClass](布尔立即创建实例)
在 GalaSoft.MvvmLight.Ioc.SimpleIoc.RegisterT 级
在 LC_Points.ViewModel.ViewModelLocator..ctor()
在 LC_Points.LC_Points_WindowsPhone_XamlTypeInfo.XamlTypeInfoProvider.Activate_0_ViewModelLocator()
在 LC_Points.LC_Points_WindowsPhone_XamlTypeInfo.XamlUserType.ActivateInstance()
内部异常:
"
有谁知道如何解决这个错误并指定 "PreferredConstructor?"
错误本身是在我注册 ViewModel 的那一行抛出的 class:
这是我的 ViewModelLocator class,其中定义了 VM 的注册:
namespace LC_Points.ViewModel
{
/// <summary>
/// This class contains static references to all the view models in the
/// application and provides an entry point for the bindings.
/// </summary>
public class ViewModelLocator
{
/// <summary>
/// Initializes a new instance of the ViewModelLocator class.
/// </summary>
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<ScoreModel>();
SimpleIoc.Default.Register<ViewSubjectGradeViewModel>();
}
public MainViewModel MainPage
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
public ViewSubjectGradeViewModel ViewSubjectGradePage
{
get
{
return ServiceLocator.Current.GetInstance<ViewSubjectGradeViewModel>();
}
}
public ScoreModel ScoreProperty
{
get
{
return ServiceLocator.Current.GetInstance<ScoreModel>();
}
}
}
}
不能这样单独注册接口。
您已注册一个接口并实现它:
class YourImplement: IEnumerable
{
....
}
SimpleIoc.Default.Register<IEnumerable, YourImplement>();
或者这样:
SimpleIoc.Default.Register<IEnumerable>(()=>new YourImplement());
Brian,这就是你要找的东西吗...
假设:
interface IMyInterface {...}
class MyClass : IMyInterface {...}
IEnumerable myEnumerable = new List<string>();
然后:
SimpleIoc.Default.Register<IMyInterface>( () => new MyClass(myEnumerable) );
聚会迟到了,但我认为您正在寻找的是用 [PreferredConstructor()] 属性装饰您的构造函数。
我怀疑你的 class "ViewSubjectGradeViewModel" 一定有多个构造函数。可能是一个无参数的构造函数,以及您想要将依赖项注入其中的构造函数:
public class ViewSubjectGradeViewModel
{
public ViewSubjectGradeViewModel()
{
//default ctor
}
[PreferredConstructor()] //add this attribute
public ViewSubjectGradeViewModel(IEnumerable<ScoreModel> addedSubjectGradePairs)
{
//dependency injected ctor
}
}
PreferredConstructorAttribute 将告知 SimpleIoc 将调用哪个构造函数。
我在我的项目中使用 MVVM Light,但我不确定如何在 ViewModelLocator class 中注册一个 Viewmodel class,它在其构造函数中接受一个参数。
我查看了 docs on IoC 但没有看到任何与使用依赖注入构造函数注册 class 有关的内容,即接受参数。
在我要注册的 class 中,构造函数在其参数中采用一个列表,如下所示:
public ViewSubjectGradeViewModel(IEnumerable<ScoreModel> addedSubjectGradePairs)
但是当我执行到 ViewModel class 的导航时,我得到一个 ActivationException,详细信息:
"Microsoft.Practices.ServiceLocation.ActivationException 未被用户代码处理 HResult=-2146233088 Message=无法注册:在 ViewSubjectGradeViewModel 中找到多个构造函数,但 none 标有 PreferredConstructor。 来源=GalaSoft.MvvmLight.Extras 堆栈跟踪: 在 GalaSoft.MvvmLight.Ioc.SimpleIoc.GetPreferredConstructorInfo(IEnumerable`1 constructorInfos,键入 resolveTo) 在 GalaSoft.MvvmLight.Ioc.SimpleIoc.GetConstructorInfo(输入服务类型) 在 GalaSoft.MvvmLight.Ioc.SimpleIoc.Register[TClass](布尔立即创建实例) 在 GalaSoft.MvvmLight.Ioc.SimpleIoc.RegisterT 级 在 LC_Points.ViewModel.ViewModelLocator..ctor() 在 LC_Points.LC_Points_WindowsPhone_XamlTypeInfo.XamlTypeInfoProvider.Activate_0_ViewModelLocator() 在 LC_Points.LC_Points_WindowsPhone_XamlTypeInfo.XamlUserType.ActivateInstance() 内部异常: "
有谁知道如何解决这个错误并指定 "PreferredConstructor?"
错误本身是在我注册 ViewModel 的那一行抛出的 class:
这是我的 ViewModelLocator class,其中定义了 VM 的注册:
namespace LC_Points.ViewModel
{
/// <summary>
/// This class contains static references to all the view models in the
/// application and provides an entry point for the bindings.
/// </summary>
public class ViewModelLocator
{
/// <summary>
/// Initializes a new instance of the ViewModelLocator class.
/// </summary>
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<ScoreModel>();
SimpleIoc.Default.Register<ViewSubjectGradeViewModel>();
}
public MainViewModel MainPage
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
public ViewSubjectGradeViewModel ViewSubjectGradePage
{
get
{
return ServiceLocator.Current.GetInstance<ViewSubjectGradeViewModel>();
}
}
public ScoreModel ScoreProperty
{
get
{
return ServiceLocator.Current.GetInstance<ScoreModel>();
}
}
}
}
不能这样单独注册接口。 您已注册一个接口并实现它:
class YourImplement: IEnumerable
{
....
}
SimpleIoc.Default.Register<IEnumerable, YourImplement>();
或者这样:
SimpleIoc.Default.Register<IEnumerable>(()=>new YourImplement());
Brian,这就是你要找的东西吗...
假设:
interface IMyInterface {...}
class MyClass : IMyInterface {...}
IEnumerable myEnumerable = new List<string>();
然后:
SimpleIoc.Default.Register<IMyInterface>( () => new MyClass(myEnumerable) );
聚会迟到了,但我认为您正在寻找的是用 [PreferredConstructor()] 属性装饰您的构造函数。
我怀疑你的 class "ViewSubjectGradeViewModel" 一定有多个构造函数。可能是一个无参数的构造函数,以及您想要将依赖项注入其中的构造函数:
public class ViewSubjectGradeViewModel
{
public ViewSubjectGradeViewModel()
{
//default ctor
}
[PreferredConstructor()] //add this attribute
public ViewSubjectGradeViewModel(IEnumerable<ScoreModel> addedSubjectGradePairs)
{
//dependency injected ctor
}
}
PreferredConstructorAttribute 将告知 SimpleIoc 将调用哪个构造函数。