我将结构图看作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应该构建或找到那些请求的服务(这是一个单调乏味的部分,但多年来它已经变得更好)
我很难掌握。
请帮忙。
由于
答案 0 :(得分:1)
如果注册的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");