Asp.net mvc 4 Ninject:如何从对象类型解析集合

Asp.net mvc 4 Ninject:如何从对象类型解析集合,asp.net-mvc-4,ninject,Asp.net Mvc 4,Ninject,只是想知道是否有办法绑定类型并解析集合。我不知道Ninject是否能做到这一点。我将MVC4与Ninject3一起使用,因此我在NinjectWebCommon.cs中注册服务。我没有任何地方可以获得内核(我读到从其他地方访问内核是不好的做法,但这肯定是解决这个问题的方法) 例如,我正在上这门课: public class CacheManager { public IEnumerable<SelectListItem> Get<T>() where T : IN

只是想知道是否有办法绑定类型并解析集合。我不知道Ninject是否能做到这一点。我将MVC4与Ninject3一起使用,因此我在NinjectWebCommon.cs中注册服务。我没有任何地方可以获得内核(我读到从其他地方访问内核是不好的做法,但这肯定是解决这个问题的方法)

例如,我正在上这门课:

public class CacheManager
{
    public IEnumerable<SelectListItem> Get<T>() where T : INameValue
公共类缓存管理器
{
public IEnumerable Get(),其中T:INameValue
我希望能够发送

CacheManager.Get<City>
CacheManager.Get

并获得CityRepository类。

这是您想要做的吗

using System.Collections.Generic;
using System.Linq;
using Ninject;
using Ninject.Modules;
using Ninject.Syntax;

public class Temp
{
    public interface ICity { }

    public class SelectListItem
    {
    }

    public class FooCity : SelectListItem, ICity { }

    public class BarCity : SelectListItem, ICity {}

    public class CityModule : NinjectModule
    {
        public override void Load()
        {
            this.Bind<ICity>().To<FooCity>();
            this.Bind<ICity>().To<BarCity>();
        }
    }

    public class CacheManager
    {
        private readonly IResolutionRoot resolutionRoot;

        public CacheManager(IResolutionRoot resolutionRoot)
        {
            this.resolutionRoot = resolutionRoot;
        }

        public IEnumerable<SelectListItem> Get<T>()
        {
            return this.resolutionRoot.GetAll<T>().OfType<SelectListItem>();
        }
    }
}
使用System.Collections.Generic;
使用System.Linq;
使用Ninject;
使用Ninject.Modules;
使用Ninject.Syntax;
公共类临时工
{
公共接口{}
公共类SelectListItem
{
}
公共类FooCity:SelectListItem,city{}
公共类BarCity:SelectListItem,ICity{}
公共类CityModule:NinjectModule
{
公共覆盖无效负载()
{
this.Bind().To();
this.Bind().To();
}
}
公共类缓存管理器
{
私有只读IResolutionRoot resolutionRoot;
公共缓存管理器(IResolutionRoot resolutionRoot)
{
this.resolutionRoot=resolutionRoot;
}
公共IEnumerable Get()
{
返回类型()的.resolutionRoot.GetAll();
}
}
}
我不清楚您是有多个T(city)实现,还是只有一个实现,但有几个实例(如从数据库检索城市名称列表并为每个名称创建一个实例)。稍后您可以通过this.Bind>().ToProvider(…)绑定来解决。

我最后做了:

在NinjectWebCommon.cs中:

        kernel.Bind(typeof(CacheManager))
            .ToSelf()
            .InSingletonScope();

        kernel.Bind<IDataListRepository<Locale>>()
            .To<LocaleRepository>();
kernel.Bind(typeof(CacheManager))
.ToSelf()
.InSingletonScope();
kernel.Bind()
.To();
在CacheManager.cs中:

public class CacheManager: IDisposable
{
    private IKernel kernel;

    public CacheManager(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public IEnumerable<T> GetAsEnumerable<T>()
    {
        var rep = kernel.Get<IDataListRepository<T>>();
        return rep.GetAll();
    }
公共类缓存管理器:IDisposable
{
私有IKernel内核;
公共缓存管理器(IKernel内核)
{
this.kernel=内核;
}
公共IEnumerable GetAsEnumerable()
{
var rep=kernel.Get();
返回rep.GetAll();
}
我不知道这是否是一种糟糕的做法(因为理论上内核应该只在初始化阶段使用),但我没有找到任何其他方法来做到这一点


如果存在更好的选项,请告诉我。

我认为这可能是工厂对Ioc?当您执行Bind.To()和Bind().To()注入IEnumerable、ICollection时,IList将导致您获得TBar和TFoo的实例。如果您不想使用Ctor或属性注入,请使用IResolutionRoot接口:return resolutionRoot.GetAll().As();我想这并不是我所需要的。让我更好地解释一下:我想有几个实体,比如城市、国家。每个实体都有自己的存储库类:IRepository。所以我想能够做一些类似Ninject的事情。解决,它应该给我IRepository的含义。你知道我的意思吗?我想实际上我的问题应该是:如何解决在ninject中创建工厂?还有一件事,我在ASPNET MVC4中,因此我不应该直接访问内核。您可能想看看:这简化了工厂。如果命名参数ctor注入不够,您必须自己实现工厂。工厂对象需要将DirectSolutionRoot注入其ctor、 “创建”工厂方法可以建立所有必需的参数。使用resolutionRoot.Get(参数…)它可以让ninject实例化城市对象。如果您要实施规范测试并上载它(整个项目或解决方案),我相信为您实现一个示例只需几分钟的时间。我知道我说过:还有一件事,我在ASPNET MVC4中,所以我不应该直接访问内核–Kat Lim Ruiz 8月30日4:03,但没有找到其他方法