You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:15:36