2

我想使用结构映射来注入一个 wcf 客户端,但我也希望这个客户端从配置中读取端点和绑定配置。我尝试了以下方法:

For<IServiceClient>().LifecycleIs(new UniquePerRequestLifecycle()).Use<ServiceClient>().
            Ctor<string>("endpointConfigurationName").Is("WsHttpBinding_IService");

但这会导致错误:

StructureMap 异常代码: 205\n缺少请求的实例属性 \"remoteAddress\" for InstanceKey \"e50e036b-9d71-47de-8ac2-d53a641e9be8\"

当我通过 remoteAddress 时,它的工作就像预期的那样:

 For<IServiceClient>().LifecycleIs(new UniquePerRequestLifecycle()).Use<ServiceClient>()
           .Ctor<string>("endpointConfigurationName").Is("WsHttpBinding_IService")
           .Ctor<string>("remoteAddress").Is("https://myurl/Service.svc");

我不明白为什么第一个构造函数重载没有从配置中读取端点地址?配置如下所示:

>

 <client>
      <endpoint address="https://myurl/Service.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService" contract="IService" name="WsHttpBinding_IService" />
 </client>
4

1 回答 1

2

第一个重载可能确实读取了端点地址,但 StructureMap 从不调用这个第一个重载,而是始终调用最贪婪的构造函数。更喜欢使用该Use方法并提供工厂委托:

For<IService>()
  .LifecycleIs(new UniquePerRequestLifecycle())
  .Use(() => new ServiceClient("WsHttpBinding_IService"))

这会强制为此生成的类使用正确的构造函数。也许将这个类隐藏在代理后面会更好。这种方式可以从您的应用程序中隐藏令人讨厌的 WCF 怪癖。对于您自己创建的类型,请避免使用多个构造函数

于 2013-09-27T13:02:39.537 回答