Trong bài viết này, mình sẽ hướng dẫn các bạn tích hợp Autofac vào WCF service Application.
Đầu tiên, bạn tạo 1 project WCF Service Application, giả sử tên là DependencyInjectionInWcfApplication
Cài đặt Autofac:
Trong đoạn code trên, mình đăng ký thêm service IMessageService, đại diện cho service logic
Bạn cần sử dụng đường dẫn chính xác tới file service trong file .svc vd:
Trường hợp bạn đặt file ServiceHostFactory vào trong thư mục con, ví dụ như Startup, thì bạn phải khai báo:
http://jmonkee.net/2011/09/05/autofac-wcfintegration-service-not-registered-with-the-autofac-container/
Chúc các bạn thành công!
Đầu tiên, bạn tạo 1 project WCF Service Application, giả sử tên là DependencyInjectionInWcfApplication
Cài đặt Autofac:
Install-Package Autofac.Wcf -Version 4.0.0
Sau đó, bạn thêm class ServiceHostFactory. Đây là service dùng để tích hợp phần đăng ký Autofac vào mỗi WCF Service.public class ServiceHostFactory : AutofacHostFactory
{
public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
{
var builder = new ContainerBuilder();
builder.RegisterType<MessageService>().As<IMessageService>();
builder.RegisterType<Service1>();
Container = builder.Build();
return base.CreateServiceHost(constructorString, baseAddresses);
}
protected override ServiceHost CreateSingletonServiceHost(object singletonInstance, Uri[] baseAddresses)
{
if (singletonInstance == null)
{
throw new ArgumentNullException("singletonInstance");
}
if (baseAddresses == null)
{
throw new ArgumentNullException("baseAddresses");
}
return new ServiceHost(singletonInstance, baseAddresses);
}
}
Note: Bạn thêm reference: System.ServiceModel.ActivationTrong đoạn code trên, mình đăng ký thêm service IMessageService, đại diện cho service logic
public class MessageService: IMessageService
{
public MessageService()
{
}
public string GetHelloWorld()
{
return "Hello World";
}
}
public interface IMessageService
{
string GetHelloWorld();
}
Để sử dụng Autofac, bạn cần khai báo trong file Service1.svc
<%@ ServiceHost Language="C#" Debug="true" Service="DependencyInjectionInWcfApplication.Service1, DependencyInjectionInWcfApplication"
Factory="DependencyInjectionInWcfApplication.ServiceHostFactory, DependencyInjectionInWcfApplication" CodeBehind="Service1.svc.cs" %>
Lưu ý:Bạn cần sử dụng đường dẫn chính xác tới file service trong file .svc vd:
"Service="Namespace.ServiceType, AssemblyName"
.Trường hợp bạn đặt file ServiceHostFactory vào trong thư mục con, ví dụ như Startup, thì bạn phải khai báo:
<%@ ServiceHost Language="C#" Debug="true" Service="DependencyInjectionInWcfApplication.Service1, DependencyInjectionInWcfApplication"
Factory="DependencyInjectionInWcfApplication.Startup.ServiceHostFactory, DependencyInjectionInWcfApplication" CodeBehind="Service1.svc.cs" %>
Sau khi đăng ký Dependency Injection xong, bạn có thể sử dụng trong Service1.cs
public class Service1 : IService1
{
private readonly IMessageService _messageService;
public Service1(IMessageService messageService)
{
_messageService = messageService;
}
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
public string GetMessage()
{
return _messageService.GetHelloWorld();
}
}
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
[OperationContract]
string GetMessage();
}
Source code: GithubTham khảo
http://eskurikhin.blogspot.com/2012/08/integrating-autofac-to-iis-hosted-wcf.htmlhttp://jmonkee.net/2011/09/05/autofac-wcfintegration-service-not-registered-with-the-autofac-container/
Chúc các bạn thành công!
Nhatkyhoctap's blog
Nhận xét
Đăng nhận xét