0

只是想知道是否有办法绑定类型并解析集合。我不知道 Ninject 是否可以开箱即用。我将 MVC4 与 Ninject3 一起使用,所以我有 NinjectWebCommon.cs 来注册服务。我无处可以获取内核(我读到从其他地方访问内核是不好的做法,但这当然可以解决这个问题)。

例如,我正在上课:

public class CacheManager
{
    public IEnumerable<SelectListItem> Get<T>() where T : INameValue

我希望能够发送

CacheManager.Get<City>

并获取 CityRepository 类。

4

2 回答 2

0

我最终做了:

在 NinjectWebCommon.cs 中:

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

        kernel.Bind<IDataListRepository<Locale>>()
            .To<LocaleRepository>();

在 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();
    }

我不知道这是否是不好的做法(因为理论上内核应该只在初始化阶段使用),但我没有找到任何其他方法来做到这一点。

如果有更好的选择,请告诉我。

于 2013-12-24T16:21:38.240 回答
0

这是你想做的吗?:

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>();
        }
    }
}

我不清楚您是否有多个 T (ICity) 实现或一个实现但有多个实例(例如从数据库中检索城市名称列表并为每个名称创建一个实例)。稍后您可以通过 this.Bind>().ToProvider(...) 绑定来解决。

于 2013-08-29T10:39:27.830 回答