2013-11-03 21 views
5

Tôi đã cấu hình thành công DI cho các dịch vụ WCF của tôi bằng Ninject. Mỗi lớp dịch vụ có một hàm tạo để Ninject đưa các cá thể vào thời gian chạy.Dependency Injection trong WCF ClaimsAuthenticationManager

public class MessageService : ServiceBase,IMessageService 
    {   
     private readonly IMessageRepository _messageRepository; 
     private readonly IMappingEngine _mapper; // AutoMapper mapping engine 

     // Instances injected in constructor by Ninject 
     public MessageService(IMessageRepository messageRepository, IMappingEngine mapper) 
     { 
      _messageRepository = messageRepository; 
      _mapper = mapper; 
     }  
    ... 
} 

Hiểu biết của tôi là điều này đạt được bằng cách yêu cầu Wcf sử dụng NinjectServiceHostFactory để kích hoạt dịch vụ.

Tất cả tốt và tốt ... nó hoạt động một điều trị.

Tôi có một số thư viện lớp được tham chiếu bởi dự án dịch vụ wcf. Một trong những thư viện này có lớp xuất phát từ ClaimsAuthenticationManager. Nó được thiết kế để chuyển đổi các xác nhận quyền sở hữu đến những tên miền cụ thể. Các giàn giáo WCF instantiates lớp này tại thời gian chạy như là một phần của đường ống nhận dạng. Tôi muốn lớp này sử dụng một mẫu kho lưu trữ để có được vai trò kinh doanh của danh tính từ một cơ sở dữ liệu. Sau đó, nó sẽ tạo một ClaimsIdentity mới với các xác nhận quyền sở hữu tên miền cụ thể. Bây giờ tôi có thể mới lên một ví dụ kho lưu trữ, nhưng tôi muốn Ninject để tiêm này lúc chạy. Tôi tạo ra một nhà xây dựng với một tham số giao diện kho lưu trữ trong hy vọng ngây thơ hoàn toàn mà Ninject sẽ chỉ làm công cụ của nó. WCF thất bại vì nó không thể tìm thấy một constructor parameterless.

Làm cách nào để lấy Ninject để tiêm thể hiện khi tôi về cơ bản không có tham chiếu đến hạt nhân Ninject trong thư viện lớp của tôi?

Sự hiểu biết của tôi là vùng chứa IoC sẽ được tạo tại gốc thành phần, trong trường hợp của tôi nằm trong máy chủ dịch vụ WCF. Vì đó là đường ống Wcf đang khởi tạo lớp của tôi nên tôi không có quyền kiểm soát quá trình để kết nối sự phụ thuộc. Hay là tôi?

Trả lời

2

Cách duy nhất để làm điều đó là đặt System.IdentityModel.Services.FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthorizationManager lập trình trong global.asax hoặc bất cứ nơi nào bạn muốn trước cuộc gọi WCF.

protected void Application_Start() 
{ 
    ... 
    FederatedAuthentication.FederationConfigurationCreated += FederatedAuthentication_FederationConfigurationCreated; 
    ... 
} 

void FederatedAuthentication_FederationConfigurationCreated(object sender, System.IdentityModel.Services.Configuration.FederationConfigurationCreatedEventArgs e) 
{ 
    var cam = DependencyResolver.Current.GetService<ClaimsAuthenticationManager>(); // Instantiate your implementation here using any IoC you want. 
    e.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager = cam; 
} 

Nếu bạn sẽ sử dụng global.asax, sau đó đừng quên để thêm vào web.config:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 
Các vấn đề liên quan