【问题标题】:StructureMap 2.6 - How to do this in configuration fileStructureMap 2.6 - 如何在配置文件中执行此操作
【发布时间】:2011-04-18 21:05:03
【问题描述】:

这里是c#代码:

var server = ******* some internal logic to determine server name ****
var username = ******* some internal logic to determine user name ****
var password = ******* some internal logic to determine password ****

ObjectFactory.Initialize(x =>
{                                            
 x.For<IService<bool>>().Add<Service>()
.Ctor<string>("server").Is(server)
.Ctor<string>("username").Is(username)
.Ctor<string>("password").Is(password)
}

这很好用,但我想把它移到配置文件中,因为我不想在我的代码中直接引用具体类型。

关于 2.6 的文档并不多。我找不到如何在配置中处理这个问题。

理想情况下,我想将服务器、用户名和密码参数注入到 ObjectFactory 以及如何在配置中使用这些参数。

(PS:不需要与 StructureMap 一起使用,任何可以支持此场景的 IAC 容器都将受到欢迎。)

谢谢

【问题讨论】:

  • 如果您将映射移动到配置 xml 文件,您将失去重构支持。你同意吗?
  • 是的,没关系。虽然并不理想。我们需要能够在不重新编译代码的情况下更改实现。
  • 另外我忘了说,这个Service对象是树的一部分,所以我不能做ObjectFactory.GetInstance。 StructureMap 会自动解决它。
  • 我不明白,你不想引用什么具体类型,为什么不呢?
  • 如果我像示例中那样在 C# 代码中进行配置,我需要添加“Service”类所属的程序集作为对我的项目的引用。我不想这样做,因为将来会有相同 IService 接口的其他实现,我想在不重新编译代码的情况下更改它。如果结构图配置在 App.Config 中,我可以轻松地将 Service 实现替换为另一个。

标签: dependency-injection structuremap ioc-container


【解决方案1】:

处理这种情况的最简单方法是引入一个新类型来提供原始构造函数参数,并在代码中注册它。然后您可以注册服务,并且该新类型可以由容器自动连接。这还允许您将获取服务器、用户名和密码的逻辑移到这个新对象中并移出容器配置。

【讨论】:

  • 嗨罗宾,感谢您的回复。我刚刚实现了您描述的相同方式,是的,它看起来更干净。但最后我搬到了 CastleWindsor,因为它的文档更加完整。我真的很纠结于 StructureMap 的文档,对于 xml 配置并没有太多帮助,看起来很多人都在通过代码配置它(如果您没有特定要求,这很有意义)。再次感谢。
猜你喜欢
  • 2013-01-19
  • 2013-04-02
  • 2010-10-03
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多