2016-03-19 21 views
1

ValidationAttribute (Asp.Net MVC3: Set custom IServiceProvider in ValidationContext so validators can resolve services) ile otofac enjeksiyonlarına izin vermek için ilgili çalışmalarla ilgili SO üzerinde birkaç ileti var ancak OWIN ve WebApi kullanıyorum, bu yüzden emin değilim. mümkün?Autofac, WebApi ve OWIN üzerinde ValidationAttribute içine enjekte edilir

Diğer tüm bağımlılık işlemleri düzgün çalışıyor.

DependencyResolver, OWIN'de doldurulmadı ve OWIN'nin doğrulama istekleri için enjeksiyonları nasıl işlediği konusunda bir farklılık okumayı hatırlıyorum. Autofac, OWIN, WebApi ve ValidationAttribute'ların mümkün olup olmadığını bilen var mı? Ve özel örneklerle?

cevap

2

Autofac ara katman yazılımını kaydettirmeniz ve daha sonra WebApi'ye genişletmeniz gerekir. Şimdi OWIN ara katmanındaki Autofac çözünürlüğünü kullanabilirsiniz.

 // Register the Autofac middleware FIRST. 
     app.UseAutofacMiddleware(container); 

     // extend the autofac scope to the web api 
     app.UseAutofacWebApi(HttpConfiguration); 

Bundan sonra WebAPI ve Owin katman aynı çözünürlük bağlamı paylaşacak ve size istediğinizi yapabilirsiniz. Böyle örneğin yapabilirsiniz ValidationAttribute kere,

, do şey:

public class AppStartup 
{ 

    public void Configuration(IAppBuilder app) 
    { 
     // Get your HttpConfiguration. In OWIN, you'll create one 
     // rather than using GlobalConfiguration. 
     var config = new HttpConfiguration(); 

     //Set builder 
     var builder = new ContainerBuilder(); 

     //IoC container build 
     var container = builder.Build(); 

     app.UseAutofacMiddleware(container); 
     app.UseAutofacWebApi(HttpConfiguration); 

     WebApiConfig.Register(HttpConfiguration); 
     app.UseWebApi(HttpConfiguration); 
    } 
} 

ve sonra

public override bool IsValid(object value) 
    { 
     var dependencyResolver = (AutofacWebApiDependencyResolver)GlobalConfiguration.Configuration.DependencyResolver; 
     using (var lifetimeScope= dependencyResolver.BeginScope()) 
     { 
      var foo = lifetimeScope.Resolve<Foo>(); 

      // use foo 
     } 
    }