首页 > 解决方案 > 如何在 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 服务?

答案https://stackoverflow.com/a/46048289/752004对我没有帮助。

标签: wcfsoapaspnetboilerplateasp.net-boilerplate

解决方案


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/

您可以参考下面的类似讨论。

将数据注入 WCF 服务


推荐阅读