1

我正在将结构图视为 IOC/DI 工具。看这个例子:

http://docs.structuremap.net/QuickStart.htm

唯一没有意义的是,如果我有一个接口并从中派生几个具体类型,在代码中:

public class ClassThatGetsAnIValidator { public void SaveObject(object objectToSave) { // 从 StructureMap 中获取正确的 IValidator IValidator validator = ObjectFactory.GetInstance();

        var notification = validator.Validate(objectToSave);
        if (notification.IsValid())
        {
            // save the object
        }
    }
}

我怎么知道我得到了哪个验证器?IE 我可能有一个 AlphaBetValidator、NumericValidator 等,有不同的方法体等等.....

我认为这是重点:

注册“什么”和“如何” StructureMap 应该构建或找到那些请求的服务(繁琐的部分,但多年来它变得更好了)

我很难掌握。

请帮忙。

谢谢

4

1 回答 1

1

文档中:

如果注册的 PluginType 只有一个 Instance,则该 Instance 将被假定为 PluginType 的默认值。否则,如果 PluginType 有多个 Instance,则必须明确告知 StructureMap 哪个 Instance 是默认的,否则对 GetInstance() 的调用将引发异常 (202)。

要解析到特定实例,您可以使用命名机制。从同一文档页面:

有时检索一个类型的“命名”实例是有利的。假设您正在构建一个需要连接到多个外部运输系统接口的系统。您已经为您的系统设计了一个名为 IshippingSystem 的接口,该接口将每个外部运输的详细信息隐藏在适配器后面。您的其余代码应该只“知道”如何与 IshippingSystem 交互,但在某些时候,某些类需要知道如何选择和检索正确的 IshippingSystem 实例。在诸如 StructureMap 之类的 IoC 容器出现之前,您可能已经手动编写了一个 Factory 类和一个 Builder 类来进行构建。使用 StructureMap,此代码只是对 ObjectFactory.GetNamedInstance(Type, string) 方法的调用。

IShippingService internationalService = ObjectFactory.GetNamedInstance<IShippingService>("International");

IShippingService domesticService = ObjectFactory.GetNamedInstance<IShippingService>("Domestic");
于 2012-06-26T14:08:33.367 回答