C# 用Ninject解析数组

C# 用Ninject解析数组,c#,asp.net-mvc,arrays,ninject,automapper,C#,Asp.net Mvc,Arrays,Ninject,Automapper,在Ninject中,对于具体类型有自动隐式自绑定。因此,无需进一步配置,我就可以解析应用程序中的每种类型,如: Foo foo = Kernel.Get(typeof(Foo)); 现在,如果我需要一个Foo数组,我会怎么做呢 Foo[] foos = Kernel.Get(typeof(Foo[])); // does not work 编辑: 为了澄清,这里是我实际想要实现的:在ASP.NET MVC应用程序中,我有一个AutoMapViewResult,就像Jimmy Bogard在这

在Ninject中,对于具体类型有自动隐式自绑定。因此,无需进一步配置,我就可以解析应用程序中的每种类型,如:

Foo foo = Kernel.Get(typeof(Foo));
现在,如果我需要一个Foo数组,我会怎么做呢

Foo[] foos = Kernel.Get(typeof(Foo[])); // does not work
编辑:

为了澄清,这里是我实际想要实现的:在ASP.NET MVC应用程序中,我有一个AutoMapViewResult,就像Jimmy Bogard在这篇伟大的文章中所说的那样!视频:或者在。区别在于,在使用AutoMapper将实体映射到视图模型之前,我需要向视图模型的构造函数注入一些服务。如果源类型是数组,我还必须实例化视图模型的数组

下面是一些简化的代码:-

public class EventsEditModel
{
    // some properties here
    public Location[] Locations { get; set; }
    public EventsEditModel(ILocationService locationService)
    {
        Locations = locationService.GetAll().ToArray();
    }
}
public class EventsListModel
{
    // some properties here
}
这是我的汽车调查结果:

public class AutoMapViewResult : ViewResult
{
    public AutoMapViewResult(object model, Type sourceType, Type destinationType)
    {
        if (model != null)
        {
            var viewModel = IoC.Resolve(destinationType);
            ViewData.Model = Mapper.Map(model, viewModel, sourceType, destinationType);
        }
    }
}
这对EventsEditModel非常有效。我的索引视图需要EventsListModel[],因此我需要实例化一个数组,该数组抛出System.ArgumentNullException:值不能为null。参数名称:行var viewModel=IoC中的源


注意:IoC.ResolveType serviceType只是内核的一个包装器。GetType serviceType

猜测:您的意思是写这个吗

Foo foo = Kernel.Get<Foo>();

Foo[] foos = Kernel.Get<Foo[]>();

好的,最后我为我的AutoMapViewResult找到了一些解决方法。它可以工作,但对我来说有点像黑客。。。然而,这是:

public class AutoMapViewResult<TSource, TDestination> : ViewResult
{
    public AutoMapViewResult(string viewName, string masterName, object model)
    {
        ViewName = viewName;
        MasterName = masterName;

        if (model.GetType().IsArray)
        {
            var viewModel = new List<TDestination>();
            foreach (var item in (TSource[])model)
            {
                viewModel.Add(Mapper.Map<TSource, TDestination>((TSource)item, IoC.Resolve<TDestination>()));
            }
            ViewData.Model = viewModel.ToArray();
        }
        else if (model.GetType().IsGenericType)
        {
            var viewModel = new List<TDestination>();
            foreach (var item in (IEnumerable<TSource>)model)
            {
                viewModel.Add(Mapper.Map<TSource, TDestination>((TSource)item, IoC.Resolve<TDestination>()));
            }
            ViewData.Model = viewModel;
        }
        else
        {
            ViewData.Model = Mapper.Map<TSource, TDestination>((TSource)model, IoC.Resolve<TDestination>());
        }
    }
}

然后,AutoMapViewResult检查传递给构造函数的模型是否是数组或泛型列表,并将其建立起来。

首先,您告诉我们有关错误的更多信息,而不是“不起作用”。可能重复@Timwi:很抱歉,这里不清楚。我不是说,这段代码不起作用,但这段代码并不打算起作用。我编辑了我的问题,以便更清楚地说明我想做什么@鲁本:我已经看过你对这个问题的回答了,但我不确定是否真的是一样的。一个不同之处是,当我试图通过自动隐式自绑定实现这一点时,有一个显式绑定。我需要使用非泛型Get函数,因为编译时不知道类型。看看我编辑过的问题。注意一点:仔细想想,我问自己如果我不指定它的长度,IoC容器是否可能返回数组。。。
public ActionResult Index()
{
    var list = orderRepository.GetAll();
    return new AutoMapViewResult<Order, OrdersListModel>(null, null, list)
}