Microsoft Enterprise Library 5.0 |
WCF and ASP.NET Web Service Applications |
To initialize the container and populate dependencies in a Web service application requires a different approach from the types of applications that expose a user interface (such as Windows Forms, WPF, and ASP.NET Web Forms). This topic describes a possible solution for ASP.NET Web services (ASMX), and points to resources that will help you implement the process in a Windows Communication Foundation (WCF) application.
ASP.NET Web Service Applications
ASP.NET Web services can partially use the technique shown in the topic ASP.NET Web Forms Applications. You can add an extension method to the HttpApplicationState class that creates and exposes the container, and add code to the application's Global.asax file to load the Enterprise Library extension into the container. However, as there are no UI controls in an ASMX application, you cannot use an HTTP module in the same manner as described for ASP.NET Web Forms applications.
Instead, to access the container, you can call the HttpContext.Current.Application.GetContainer() extension method. You can use this reference to the container to pass the current class to the BuildUp method to populate any dependencies you define by applying attributes. For example, the following code uses dependency injection to resolve a concrete instance of a class that implements the IMyService interface (for which the container must contain a mapping) and uses it to calculate the return value from the UseDataService Web method.
C# | Copy Code |
---|---|
using System.Web; public class MyWebService : System.Web.Services.WebService { private IMyService theService; public MyWebService() { // Pass this class through the container using the BuildUp method HttpContext.Current.Application.GetContainer().BuildUp(this); } [Dependency] public IMyService DataService { get { return theService; } set { theService = value; } } [WebMethod] public string UseDataService() { return "The value you require is " + theService.DoSomething(); } } |
Visual Basic | Copy Code |
---|---|
Imports System.Web Public Class MyWebService Inherits System.Web.Services.WebService Private theService As IMyService Public Sub New() ' Pass this class through the container using the BuildUp method HttpContext.Current.Application.GetContainer().BuildUp(Me) End Sub <Dependency> _ Public Property DataService() As IMyService Get Return theService End Get Set theService = value End Set End Property <WebMethod> _ Public Function UseDataService() As String Return "The value you require is " & theService.DoSomething() End Function End Class |
Alternatively, you can use the basic approach shown in the topic ASP.NET Web Forms Applications to create and populate the container in the Application dictionary object, and then access it from your Web methods when you need to resolve any types.
WCF Applications
In Windows Communication Foundation (WCF) applications, you can use a technique similar to the basic approach described in this topic. However, there is no HttpApplication state store in WCF. Instead, you might use the InstanceContext with the InstanceContextMode set to Single so that only a single instance of the state exists, and is available to all requests. You must also create a custom extension to the InstanceContext by implementing the IExtension interface. For more information, see IExtension(T) Interface on MSDN®.
Alternatively, consider using the WCF Integration Pack for Enterprise Library. It contains classes that you can use directly to enable storage of and access to the container in WCF applications, and it can be used to automatically populate dependencies in your classes. For more information, see the Enterprise Library Community Web site on CodePlex.