wcf - 如何在 abp Boilerplate 中将 IApplicationService 调用到 WCF SOAP 服务中?
问题描述
我使用 abp 样板开发了一个 MVC 应用程序,现在我有必要通过 WFC/SOAP 公开一些服务。
这个想法是创建一个 WFC 服务,注入所需的IApplicationService
并使用它。
就像是:
// this code does not work
public class MyFirstService : IMyFirstService, ITransientDependency {
private readonly ICourseAppService _courseAppService;
// Injection here does not work!
public MyFirstService(ICourseAppService courseAppService) {
_courseAppService = courseAppService;
}
public CourseDto GetData(int id) {
return _courseAppService.Get(id);
}
}
但是这段代码不起作用。:-(
我遇到的第一个错误来自WCF,说服务没有没有参数的默认构造函数。所以我走错路了。
如何将服务注入 SOAP 服务?
解决方案
WCF 使用反射来创建服务实例,因此如果您的服务没有没有参数的构造函数,则 wcf 将无法创建服务实例,这就是 wcf 显示错误的原因。
将注入框架与 wcf 集成并不容易。
您应该自定义实例提供程序(提供 wcf 服务实例)。
https://blogs.msdn.microsoft.com/carlosfigueira/2011/05/31/wcf-extensibility-iinstanceprovider/
在您的自定义实例提供者中,您可以在 GetInstance 方法中提供您注入的服务实例。
然后,您应该使用服务行为让 wcf 使用您自己的实例提供程序。
例如
public class MyServiceAttribute : Attribute, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher item in serviceHostBase.ChannelDispatchers)
{
foreach (EndpointDispatcher item1 in item.Endpoints)
{
item1.DispatchRuntime.InstanceProvider = new MyInstanceProvider(); // apply customized instanceProvider
}
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
然后你应该自定义一个 ServiceHost 来应用服务行为。像
public class MyUnityServiceHost : ServiceHost
{
protected MyUnityServiceHost()
{
}
protected override void OnOpening()
{
base.OnOpening();
if (this.Description.Behaviors.Find<MyServiceAttribute >() == null)
{
this.Description.Behaviors.Add(new MyServiceAttribute ());//add your behavior
}
}
}
最后,您应该自定义 HostFactory 以创建您自定义的服务主机。 https://blogs.msdn.microsoft.com/carlosfigueira/2011/06/13/wcf-extensibility-servicehostfactory/
您可以参考下面的类似讨论。
推荐阅读
- c# - 列表
.Insert() 越界?C# - xamarin - 如何在 macOS .app 可执行文件中捆绑许多 dylib(同时保持目录结构)和 nuget .targets 文件?
- sql-server - 结果集数据以文本/CSV 文件形式上传到 Azure 存储位置
- reactjs - React JS路由路径不起作用
- sql - 删除项目“WHEN NOT MATCHED BY SOURCE”
- r - 将空间点与 180° 子午线相交?
- c# - 将属性名称转换为有效的 json 字段标识符
- php - Laravel 5 批量更新记录,批量更新记录
- javascript - 使用 Redux 存储进行流类型检查是如何工作的?
- amazon-web-services - 如何在具有私有拓扑和内部负载平衡器的 AWS 上连接到我的集群?