代码之家  ›  专栏  ›  技术社区  ›  magol Nathaniel Roark

在Ninject中使用factory方法,我无法将属性添加到

  •  1
  • magol Nathaniel Roark  · 技术社区  · 14 年前

    我尝试使用Ninject注入一个XmlReader。问题是它是由一个工厂方法创建的,而不是构造函数。我无法添加 [Inject] 在.NET框架中编写代码。现在,我使用以下绑定创建XmlReader:

    Bind<IXmlReader>()
        .ToMethod(
            x =>
            XmlReader.Create(
                            (string) GetParameter(x, "inputUri"),
                            (XmlReaderSettings) GetParameter(x, "settings")))
        .Named("definition");            
    
    
    private object GetParameter(IContext context, string name)
    {
        var parameters = (List<IParameter>) context.Parameters;
        return (from p in parameters 
                where p.Name == name 
                select p.GetValue(context))
                .FirstOrDefault();
    }
    

    我使用它如下:

    var reader = _kernel.Get<IXmlReader>("definition",
                                         new Parameter("inputUri", FilePath, false),
                                         new Parameter("settings", settings, false)))
    

    1 回复  |  直到 14 年前
        1
  •  1
  •   Ruben Bartelink    13 年前

    你不是在做DI,而是在做服务定位。

    我不知道你的真实情况,但我想我会依赖 Func<string,string,IXmlReader>

    Bind<Func<string,string,IXmlReader>>()
        .ToMethod( (inputUri,settings) => XmlReader.Create( inputUri,settings))
        .Named("definition");
    

    然后在构造函数参数中声明注入的项:

    [Named("definition")]Func<string,string,IXmlReader> createReader
    

    有趣的是 [Named] 上面是我自己的makey upey属性,您需要在绑定时执行条件方面的操作。看看道场,它会教你怎么做。 有一个内置的 NamedAttribute (已经很久了,不知道我在想什么)。

    如果像注入工厂这样的方法在你的情况下是有用的,那么接下来要看的是 Ninject.Extensions.Factory