我尝试使用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)))
但这段代码太可怕了。我可以用更漂亮更聪明的方式重写它吗?
答案 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。它以干净的方式处理大多数这些工厂要求。