如何为ASMX服务启用Unity依赖注入?
ASMX服务集成Unity依赖注入的实现方案
ASMX属于传统ASP.NET Web服务,和WCF架构逻辑不同,无法直接复用WCF的ServiceHostFactory配置逻辑。以下是两种可行的实现方案:
方案一:自定义WebServiceHandlerFactory(全局生效)
ASMX服务的实例默认由System.Web.Services.Protocols.WebServiceHandlerFactory创建,我们可以继承这个类,在实例创建环节通过Unity注入依赖:
1. 实现自定义工厂及处理器
using System; using System.Web.Services.Protocols; using Microsoft.Practices.Unity; public class UnityWebServiceHandlerFactory : WebServiceHandlerFactory { // 假设已存在全局Unity容器实例 private static readonly IUnityContainer _container = UnityConfig.GetContainer(); protected override WebServiceHandler CreateHandler(Type type) { // 用Unity解析服务实例,替代默认无参构造创建逻辑 var serviceInstance = _container.Resolve(type); return new UnityWebServiceHandler(type, serviceInstance); } } // 自定义处理器,返回注入后的服务实例 public class UnityWebServiceHandler : WebServiceHandler { private readonly object _serviceInstance; public UnityWebServiceHandler(Type type, object serviceInstance) : base(type) { _serviceInstance = serviceInstance; } protected override object GetService() { return _serviceInstance; } }
2. 配置web.config替换默认处理器
根据IIS模式添加对应配置:
<!-- IIS经典模式配置 --> <system.web> <httpHandlers> <add verb="*" path="*.asmx" type="你的命名空间.UnityWebServiceHandlerFactory, 你的程序集名称"/> </httpHandlers> </system.web> <!-- IIS 7+集成模式补充配置 --> <system.webServer> <handlers> <add name="UnityAsmxHandler" verb="*" path="*.asmx" type="你的命名空间.UnityWebServiceHandlerFactory, 你的程序集名称" preCondition="integratedMode"/> </handlers> </system.webServer>
3. 注册服务到Unity容器
确保ASMX服务及其依赖已在Unity容器中注册:
public static class UnityConfig { public static IUnityContainer GetContainer() { var container = new UnityContainer(); // 注册ASMX服务 container.RegisterType<MyNamespace.MyWebservice>(); // 注册服务依赖 container.RegisterType<IMyDependency, MyDependencyImpl>(); return container; } }
方案二:重写WebService的InitializeLifetimeService(单个服务生效)
如果只需给特定ASMX服务注入依赖,可以直接在服务类中重写实例获取逻辑,无需修改全局handler配置:
using System.Web.Services; using Microsoft.Practices.Unity; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class MyWebservice : WebService { // 声明依赖属性 public IMyDependency MyDependency { get; set; } public override object InitializeLifetimeService() { // 从Unity容器解析当前服务实例,自动注入依赖 return UnityConfig.GetContainer().Resolve<MyWebservice>(); } [WebMethod] public string GetGreeting() { return MyDependency.GetGreetingContent(); } }
内容的提问来源于stack exchange,提问作者AjStar08
相关产品推荐
相关产品推荐

