【发布时间】:2013-10-18 23:54:12
【问题描述】:
我遇到了一个我想用 Ninject 解决的场景,但到目前为止,我的所有工作都没有遇到过这种情况。
WCF 服务应用程序
W3C 日志解析应用程序(出于演示目的过于简单化)。
由 W3CLogItem 实现的 IW3CLogItem W3CLogItem 有一个 IUrlData 类型的公共成员(包含重要数据,但可以是 5 个具体实现之一,具体取决于它包含的内容)。
使用哪个具体实现取决于字符串匹配,其构造函数采用正则表达式模式,它将用于解析数据以及要解析的字符串。
目前我有一个简单的工厂来进行字符串比较,然后调用 Create() 来返回一个新的具体对象(DocumentUrlItem、DriverUrlItem、AssetUrlItem 等...)。
我正在查看 wiki 文档以及如何命名绑定,但即使这样也只能让我了解一半。
我的问题是:这可以在没有工厂的情况下完成吗?我能否以某种方式在绑定(即 .contains 等)上放置一个条件属性,该属性评估为 true 以知道要使用哪个绑定,或者我最好还是坚持使用工厂?
让我们详细说明一下。
如果我以简化的方式编写不带ninject 的工厂,它将如下所示:
protected IUrlData Create(string urldata)
{
if (urldata.Contains("bob"))
{
return new BobUrlData(urldata)
}
else if (urldata.Contains("tim"))
{
return new TimUrlData(urldata);
}
}
注意几点:
1) 实现 IUrlData 的类的数量会随着时间的推移而增长。字符串“tim”和“bob”将来自数据库。
2) 传递给 BobUrlData 和 TimUrlData 的 urldata 不是现实世界中唯一的参数,还会有一个正则表达式(也来自数据库,它由知道如何处理该特定的条目时间戳计算)随着时间的推移进入。
3) 我真的很好奇这是否可以使用 Ninject 来完成,而不需要一起使用工厂,以某种方式通过元数据或名称实现相同的工作,但全部通过绑定,同时保持代码可扩展但只读(除了绑定模块)。
【问题讨论】:
标签: c# dependency-injection inversion-of-control ninject