Surging超级程序猿ABP

ABP框架集成WCF实现依赖注入

2019-03-04  本文已影响3人  邵佳楠

最近有一个项目需要在ABP框架中对外提供基于SOAP协议的服务,自然而然想到了用WebService和WCF,后来对比了一下还是使用WCF来进行实现。
在实现的过程中需要与数据库进行交互,首先想到的是直接在构造函数中进行注入,但是直接给我报了这样的这个错误

The service type provided could not be loaded as a service because it does not have a default (parameter-less) constructor.
To fix the problem, add a default constructor to the type, or pass an instance of the type to the host.

后来百度找了几篇文章,后来在这里找到了

解决方案:

在WCF中实现依赖注入得实现IInstanceProvider与IServiceBehavior这两个接口,并让实现IServiceBehavior的类成为一个Attribute(继承自Attribute),然后加在WCF服务实现类上,就可以实现WCF的构造函数依赖注入。

大致实现步骤如下:

public class IocInstanceProvider : IInstanceProvider
    {
        Type _serviceType;
        IocManager _container;

        public IocInstanceProvider(Type serviceType)
        {
            _serviceType = serviceType;
            _container = IocManager.Instance;//ABP的IOC容器
        }
        public object GetInstance(InstanceContext instanceContext, Message message)
        {
            if (_container.IsRegistered(_serviceType))
            {
                return _container.Resolve(_serviceType);
            }
            return null;
        }

        public object GetInstance(InstanceContext instanceContext)
        {
            return GetInstance(instanceContext, null);
        }

        public void ReleaseInstance(InstanceContext instanceContext, object instance)
        {
            if (instance is IDisposable)
                ((IDisposable)instance).Dispose();
        }
    }
public class IocServiceBehavior : System.Attribute, IServiceBehavior
    {
        #region IServiceBehavior Members

        public void ApplyDispatchBehavior(ServiceDescription serviceDescription,ServiceHostBase serviceHostBase)
        {
            foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
            {
                foreach (EndpointDispatcher ed in cd.Endpoints)
                {
                    if (!ed.IsSystemEndpoint)
                    {
                        ed.DispatchRuntime.InstanceProvider = 
                            new IocInstanceProvider(serviceDescription.ServiceType);
                    }
                }
            }
        }

        #endregion
    }
       public override void PreInitialize()
        {           
            //你对应的WCF服务
            IocManager.Register<IMSSTransfer,MSSTransfer>();
        }

以上就是这些,大功告成

上一篇 下一篇

猜你喜欢

热点阅读