Ninject(IoC)和具有条件逻辑的工厂的替代品

时间:2013-10-18 23:54:12

标签: c# dependency-injection inversion-of-control ninject

我遇到了一个我想用Ninject解决的场景,但到目前为止我的工作都没有遇到过这种情况。

WCF服务应用

W3C Log Parsing App(过于简单化以用于演示目的)。

IW3CLogItem由W3CLogItem实现 W3CLogItem有一个IUrlData类型的公共成员(包含重要数据,但可以是5个具体实现之一,具体取决于它包含的内容)。

决定使用哪个具体实现是基于字符串匹配,其构造函数采用正则表达式模式,它将用于解析数据以及要解析的字符串。

目前我有一个简单的工厂进行字符串比较,然后调用Create()来返回一个新的具体对象(DocumentUrlItem,DriverUrlItem,AssetUrlItem等......)。

我正在查看维基文档以及如何命名绑定,但即便如此,只能让我一半。

我的问题是:这可以在没有工厂的情况下完成吗?我可以以某种方式将一个条件属性放在一个绑定(即.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完成,而不需要一起工厂,以某种方式通过元数据或名称实现相同的工作,但所有通过绑定,同时保持代码可扩展但只读(除了绑定模块)。

2 个答案:

答案 0 :(得分:0)

您可以使用Ninject绑定到方法。

Ninject Wiki - Contextual Binding

如果您设置方法以返回所需内容,则不应再需要工厂。我不能说一个比另一个好,但因为它们都有效,但我确实更喜欢工厂做工作并且有权访问Ninject给我正确的实现。你的结果最终还是一样的。

此外,在同一页面的正上方是Specifying Constraints

答案 1 :(得分:0)

从纯粹主义的角度来看,抽象工厂是从对象接口中抽象出实现的正确方法。话虽如此,ninject提供了各种方法来实现你想要的东西而不使用抽象工厂。我觉得最有帮助的是ToMethodproviders