0

我遇到了一个我想用 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 来完成,以某种方式通过元数据或名称实现相同的工作,但全部通过绑定,同时使代码可扩展但只读(除了绑定模块)。

4

2 回答 2

0

从纯粹主义者的角度来看,抽象工厂是从对象接口抽象出实现的正确方法。话虽如此,ninject 提供了多种方式来实现您想要的,而无需使用抽象工厂。我觉得对你最有帮助的是ToMethod提供者

于 2013-10-19T02:17:14.550 回答
0

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

Ninject Wiki - 上下文绑定

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

此外,在同一页面的正上方是指定约束

于 2013-10-19T02:14:39.550 回答