代码之家  ›  专栏  ›  技术社区  ›  omriman12

ninject-绑定类型列表

  •  2
  • omriman12  · 技术社区  · 7 年前

    Ninject List

    private readonly IList<IDispatchFilter> m_Filters;
    
    public DispatchFilteringManager(IList<IDispatchFilter> filters)
    {
        m_Filters = filters;
    }
    

    Bind<IList<IDispatchFilter>>()
        .ToMethod(bindDecoyDispatchFilters)
        .InSingletonScope();
    
    private IList<IDispatchFilter> bindDecoyDispatchFilters(IContext context)
    {
        Bind<IDispatchFilter>().To<WindowsXpFilter>();
    
        IList<IDispatchFilter> result = context.Kernel.GetAll<IDispatchFilter>().ToList();
    
        return result;
    }
    

    但是在我的构造器中我得到一个空的 .

    2 回复  |  直到 7 年前
        1
  •  1
  •   Fabjan    7 年前

    更改:

    Bind<IList<IDispatchFilter>>()
        .ToMethod(bindDecoyDispatchFilters)
        .InSingletonScope();
    
    private IList<IDispatchFilter> bindDecoyDispatchFilters(IContext context)
    {
        Bind<IDispatchFilter>().To<WindowsXpFilter>();
        ...
    }
    

    Bind<IDispatchFilter>().To<WindowsXpFilter>();
    Bind<IList<IDispatchFilter>>()
        .ToMethod(bindDecoyDispatchFilters)
        .InSingletonScope();
    
    private IList<IDispatchFilter> bindDecoyDispatchFilters(IContext context)
    {
        ...
    }
    

    我们使用的方法 .ToMethod T 只有当我们调用 container.Get<T>

    当Ninject试图解决 IList<IDispatchFilter>> bindDecoyDispatchFilters 方法查找的所有绑定 IDispatchFilter 在那之前

        2
  •  1
  •   StuartLC    7 年前

    Multi Injection works IList<T> <T> ,而不是实际使用显式注册的方法来解析

    因此, bindDecoyDispatchFilters .ToMethod(bindDecoyDispatchFilters) i列表<t> T .(这很容易测试-放置一个断点,或 Assert.Fail()

    Bind<IDispatchFilter>().To<WindowsXpFilter>();
    

    是唯一的 IDispatchFilter IList Bind<IDispatchFilter>().To<WindowsXpFilter>();

    i列表<t>

    Bind<IList<IDispatchFilter>>() ... remove 
        .ToMethod(bindDecoyDispatchFilters)
        .InSingletonScope();
    

    BindDecoyDispatchFilters(BindDecoyDispatchFilters)

    但是,如果在引导后过滤器列表发生更改,并且您确实需要一个动态工厂方法来将可用的过滤器返回给构造函数,那么您可以使用 hack like this

    或者,如果没有许多类依赖于 IList<>

    kernel.Bind<ResolveMe>()
         .ToSelf()
         .WithConstructorArgument<IEnumerable<IDispatchFilter>>(bindDecoyDispatchFilters);
    
    private IList<IDispatchFilter> bindDecoyDispatchFilters(IContext context)
    {
        // Contract.Assert(1 == 0); // .. .ensure the method is called during resolution!
        context.Kernel.Bind<IDispatchFilter>().To<WindowsXpFilter>();
        return context.Kernel.GetAll<IDispatchFilter>().ToList();
    }
    

    我用来测试的课程是:

    public interface IDispatchFilter {}
    
    public class WindowsXpFilter : IDispatchFilter { }
    
    public class ResolveMe
    {
        public IEnumerable<IDispatchFilter> Stuff { get; set; }
    
        public ResolveMe(IEnumerable<IDispatchFilter> stuff) { Stuff = stuff; }
    }
    

      var y = kernel.Get<ResolveMe>();
      Assert.IsTrue(y.Stuff.Any());