指定要检索的具体类型

时间:2012-06-26 10:15:40

标签: structuremap

我将结构图看作IOC / DI工具。看看这个例子:

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

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

公共类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等,有不同的方法体等等......

我认为这就是重点:

注册“what”和“how”StructureMap应该构建或找到那些请求的服务(这是一个单调乏味的部分,但多年来它已经变得更好)

我很难掌握。

请帮忙。

由于

1 个答案:

答案 0 :(得分:1)

来自documentation

  

如果注册的PluginType只有一个实例,那么   实例将被假定为PluginType的默认值。   否则,如果PluginType有多个实例,   必须明确告诉StructureMap哪个Instance是默认的,   否则对GetInstance()的调用将抛出异常(202)。

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

  

有时检索类型的“命名”实例是有利的。   假设您正在构建一个需要连接的系统   与多个外部运输系统的接口。你设计了一个   您的系统的接口名为IShippingSystem,隐藏了   适配器后面每个外部运输的详细信息其余的你   代码应该只“知道”如何与IShippingSystem交互,但是   在某些时候,某些类需要知道如何选择和检索   适当的IShippingSystem实例。在IoC出现之前   像StructureMap这样的容器,你可以编写一个Factory类和   可能是一个Builder类手工完成构建。同   StructureMap,这段代码只是一个调用   ObjectFactory.GetNamedInstance(Type,string)方法。

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

IShippingService domesticService = ObjectFactory.GetNamedInstance<IShippingService>("Domestic");