C# 用Ninject解析数组
在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在这
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)
}