依赖关系 – ASMX依赖注入和IoC
所以我试图让我的asmx webservice使用依赖注入和使用IoC来做到这一点。我希望我的网络服务能够使用我的内部业务层服务。 Web服务将由外部客户端从不同的域使用,主要用于发送和接收有关诸如订单和客户之类的实体的信息。
一个例子是: public class MyService : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return new MyBusinessService().MyMethod(); } } public class MyBusinessService : IMyBusinessService { public string MyMethod() { return "hello"; } } 我想使用依赖注入来消除对我的服务“新建”的需要,但是我无法想出这样做。我可以让它工作使用可怜的人DI,或至少我认为这被称为“穷人”。 喜欢这个: public class MyService : System.Web.Services.WebService { private IMyBusinessService _myService; public MyService(IMyBusinessService myService) { _myService = myService; } public MyService() : this(new MyBusinessServie()) { } [WebMethod] public string HelloWorld() { return _myService.MyMethod(); } } 但是我根本无法弄清楚如何使用IoC容器来注入我的依赖项,因为我无法在没有参数的构造函数的情况下运行该服务。
不幸的是,在ASP.NET中无法使用Web服务来执行构造器注入。 ASP.NET要求您提供一个默认构造函数。 MyService的构造函数与您使用这种类型的Web服务可以获得的组合根大致相同,而不使用DI容器。
使用ASP.NET,具有多个组合根源并不罕见。哪些可以是单个Web服务和网页的构造函数。如果您正在使用ASP.NET MVC,那么ControllerFactory就是更加DI的友好。 随着您的实现,重要的部分是不要从Web服务移动对象图形的构造,因为这是您的组成根。要做的最主要的事情是保持Web服务尽可能的薄,保持大部分逻辑依赖,以便可以测试或重用。从HTTP标头中拉出信息是Web服务可以将该信息传递给依赖关系的任务的示例。 马克·塞曼(Mark Seemann)提供了一本关于DI图案和技术的好书。 如果您的Web服务实现System.Web.IHttpHandler而不是从System.Web.Services.WebService派生,您可以像这样实现您的DI: Global.ashx.cs public class Global : HttpApplication { protected void Application_PreRequestHandlerExecute(object sender,EventArgs e) { var context = ((HttpApplication)sender).Context; var needsMyBusinessService = context.Handler as INeedMyBusinessService; if (needsMyBusinessService != null) needsMyBusinessService.MyBusinessService = new MyBusinessService(); } } MyService.ashx.cs public class MyService : IHttpHandler,INeedMyBusinessService { public IMyBusinessService MyBusinessService { get; set; } public bool IsReusable { get { return true; } } public void ProcessRequest(HttpContext context) { // uses my dependency } } INeedMyBusinessService.cs public interface INeedMyBusinessService { IMyBusinessService MyBusinessService { get; set; } } 但是,这种实现的抓住是,对于实现System.Web.Services.WebService的Web服务不起作用,因为在调用PreRequestHandlerExecute事件之前Web服务对象不被初始化,这是调用ProcessRequest之前的最后一个事件。 如果您想为每个Web服务拥有一个唯一的实例,上述示例将会起作用。如果您想为每个Web服务请求提供与MyBusinessService相同的实例(Singleton生命周期),则可以实现Global.ashx.cs文件: public class Global : HttpApplication { private static IMyBusinessService businessService; protected void Application_Start(object sender,EventArgs e) { Global.businessService = new MyBusinessService(); } protected void Application_PreRequestHandlerExecute(object sender,EventArgs e) { var context = ((HttpApplication)sender).Context; var needsMyBusinessService = context.Handler as INeedMyBusinessService; if (needsMyBusinessService != null) needsMyBusinessService.MyBusinessService = Global.businessService; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |