如何使用依赖注入构造函数注册 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 将调用哪个构造函数。