在Ninject中使用我无法添加属性的工厂方法

时间:2010-10-21 20:54:00

标签: ninject ninject-2

我尝试使用Ninject注入XmlReader。问题是它是由构造函数的工厂方法创建的。我无法在.NET Framework中的代码中添加[Inject]。现在我使用以下绑定来创建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 个答案:

答案 0 :(得分:1)

你没有做DI,你正在做服务地点。

我不知道你的真实背景,但我认为我依赖于Func<string,string,IXmlReader>并按照以下方式进行绑定: -

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

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

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

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

如果注入工厂之类的东西对你的情况有用,那么接下来要看的是Ninject.Extensions.Factory。它以干净的方式处理大多数这些工厂要求。