1

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

但是这段代码太可怕了。我可以用更漂亮更聪明的方式重写它吗?

4

1 回答 1

1

您不是在做 DI,而是在做 Service Location。

我不知道你的真实背景,但我认为我会依赖 aFunc<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。它以干净的方式处理大多数此类工厂要求。

于 2010-10-22T08:23:36.723 回答