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的构造函数依赖注入。
大致实现步骤如下:
- 首先实现IInstanceProvider
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();
}
}
- 实现IServiceBehavior
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
}
-
在你的WCF服务上添加属性标签
添加属性标签 -
最后也是最容易忘的就是注册你的WCF服务到ABP的IOC容器中
找到你对应的模块(Module)中的 PreInitialize方法
public override void PreInitialize()
{
//你对应的WCF服务
IocManager.Register<IMSSTransfer,MSSTransfer>();
}
以上就是这些,大功告成