我想将值传递给实现我的服务的类的构造函数 .
但是,ServiceHost只允许我传递要创建的类型的名称,而不是传递给其构造函数的参数 .
我希望能够传入一个创建我的服务对象的工厂 .
到目前为止我发现了什么:
- WCF Dependency Injection Behavior这比我正在寻找的更多,而且似乎对我的需求过于复杂 .
我想将值传递给实现我的服务的类的构造函数 .
但是,ServiceHost只允许我传递要创建的类型的名称,而不是传递给其构造函数的参数 .
我希望能够传入一个创建我的服务对象的工厂 .
到目前为止我发现了什么:
8 回答
这是一个非常有用的解决方案 - 特别是对于新手WCF编码器的人 . 我确实想为任何可能将其用于IIS托管服务的用户发布一点提示 . MyServiceHost需要继承 WebServiceHost ,而不仅仅是ServiceHost .
这将为IIS中的 endpoints 创建所有必需的绑定等 .
您需要实现自定义
ServiceHostFactory
,ServiceHost
和IInstanceProvider
的组合 .给定具有此构造函数签名的服务:
这是一个可以启动MyService的示例:
在MyService.svc文件中注册MyServiceHostFactory,或直接在代码中使用MyServiceHost进行自托管方案 .
您可以轻松地概括这种方法,事实上一些DI容器已经为您完成此操作(提示:Windsor的WCF工厂) .
您可以简单地创建
Service
的实例并将该实例传递给ServiceHost
对象 . 您唯一需要做的就是为服务添加[ServiceBehaviour]
属性,并使用[DataContract]
属性标记所有返回的对象 .这是一个模拟:
和用法:
我希望这会让某人的生活更轻松 .
Mark对
IInstanceProvider
的回答是正确的 .您也可以使用自定义属性(例如
MyInstanceProviderBehaviorAttribute
),而不是使用自定义ServiceHostFactory . 从Attribute
派生它,使其实现IServiceBehavior
并实现IServiceBehavior.ApplyDispatchBehavior
方法然后,将该属性应用于您的服务实现类
第三个选项:您还可以使用配置文件应用服务行为 .
我从马克的答案开始,但(至少在我的情景中),它是不必要的复杂 . 其中一个
ServiceHost
构造函数接受该服务的实例,您可以直接从ServiceHostFactory
实现传入该实例 .为了搭载Mark的例子,它看起来像这样:
拧紧它......我混合了依赖注入和服务定位器模式(但主要是依赖注入,它甚至发生在构造函数中,这意味着你可以拥有只读状态) .
服务的依赖关系在它的嵌套
Dependencies
类的合约中明确规定 . 如果您正在使用IoC容器(尚未为您修复WCF混乱的容器),则可以将其配置为创建Dependencies
实例而不是服务 . 通过这种方式,您可以获得容器给您的温暖模糊感,同时也不必跳过WCF强加的太多箍 .我不会因为这种方法而失眠 . 别人也不应该 . 毕竟,你是IoC容器是一个庞大,肥胖,静态的代表集合,为你创造东西 . 又增加了一个?
我们面临着同样的问题,并以下列方式解决了这个问题 . 这是一个简单的解决方案 .
在Visual Studio中,只需创建一个普通的WCF服务应用程序并删除它的界面 . 保留.cs文件(只是重命名)并打开该cs文件,并用实现服务逻辑的原始类名替换接口的名称(这样服务类使用继承并替换实际的实现) . 添加一个调用基类构造函数的默认构造函数,如下所示:
MyService基类是服务的实际实现 . 此基类不应具有无参数构造函数,而只应具有接受依赖项的参数的构造函数 .
该服务应使用此类而不是原始MyService .
这是一个简单的解决方案,就像一个魅力:-D
我使用我的类型的静态变量 . 不确定这是否是最佳方式,但它对我有用:
当我实例化服务主机时,我执行以下操作: