2013-11-03 37 views
5

Ninject kullanarak WCF hizmetlerim için DI'yi başarıyla yapılandırdım. Her hizmet sınıfında, Ninject'in çalışma zamanında örneklerini enjekte ettiği bir kurucu vardır.WCF'de Bağımlılık Enjeksiyonu İddialarAuthenticationManager

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; 
     }  
    ... 
} 

Benim anlayış bu hizmetlerini etkinleştirmek için NinjectServiceHostFactory kullanmak WCF anlatarak elde edilir olmasıdır.

Her şey iyi ve iyi bir muamele yapıyor.

Wcf hizmet projesi tarafından başvurulan bir dizi sınıf kitaplığım var. Bu kitaplıklardan biri, ClaimsAuthenticationManager'dan türeyen bir sınıfa sahiptir. Gelen iddiaları alana özgü olanlara dönüştürmek için tasarlanmıştır. WCF iskelesi bu sınıfı, çalışma zamanında kimlik boru hattının bir parçası olarak başlatır. Bu sınıfın kimliğin iş rollerini bir veritabanından almak için bir havuz deseni kullanmasını istiyorum. Daha sonra, etki alanına özgü hak talepleriyle yeni bir ClaimsIdentity oluşturur. Artık bir depo örneğini yenileyebilirim, ancak bunu yapmak için Ninject'in bunu çalışma zamanına eklemesini istiyorum. Ninject'in sadece bir şeyler yapacağı umudunda bir havuz arabirim parametresi olan bir kurucu oluşturdum. WCF, parametresiz bir kurucu bulamadığı için başarısız oldu.

Sınıf kitaplığımdaki Ninject çekirdeğine hiç başvurmadığım durumlarda örneği enjekte etmek için Ninject'i nasıl alabilirim?

Anlayışlılığım, IoC konteynerinin WCF servis ana bilgisayarında bulunan kompozisyon kökü üzerinde oluşturulması gerektiğidir. Sınıfımı anlatan Wcf boru hattı olduğundan, bağımlılığı sağlamak için süreç üzerinde hiçbir kontrolüm yok. Yoksa ben mi?

cevap

2

Bunu yapmanın tek yolu System.IdentityModel.Services.FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthorizationManager'ı global.asax içinde veya WCF çağrısından önce istediğiniz yere programlamaktır.

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; 
} 

Global.asax kullanacaksa, o zaman web.config eklemek unutmayın:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 
İlgili konular