2013-08-20 12 views
6

Kısmen MVC'ye yeniden yazılmış eski bir Web.Forms uygulamasına sahibim. MVC parçası, bir bağımlılık enjeksiyon kabı olarak autofac kullanır.Autofac, MVC (ActionFilters ile), Web.Forms - bağımlılık çözünürlüğü çakışma

MVC kısmı özel filtre tanımlanmıştır: Web.Forms entegrasyon web.config'de devre dışı zaman iyi çalışır

public class CustomActionFilter : ActionFilterAttribute 
{ 
    protected ILogger Logger { get; set; } 
    public CustomActionFilter(ILogger logger) { Logger = logger; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Logger.Log("OnActionExecuting"); 
    } 
} 

. Hovewer, Web.Forms autofac entegrasyonunu kullanmaya çalıştığımda, autofac internals (stack trace) 'da bir yerde AutofacFilterProvider ile ilgili NullReferenceException var.

:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
     filters.Add(DependencyResolver.Current.GetService<CustomActionFilter>()); 
    } 
} 

Denedim:

    Aynı sonuç
  1. Kullanım mülkiyet enjeksiyon yerine yapıcı - - Ayrı MVC için kaplar ve Web.Forms kullanılarak
  2. aynı sonucu
  3. Açıkça web.forms sayfalarında bağımlılıkları çözünürlüğü tetiklemek (gibi this) -

çalıştı Yani, soru, hem de MVC ve web.forms bölümünün arkasındaki sahne bağımlılık çözünürlüğü sağlamak için herhangi bir yolu vardır. Autofac ve yeni bağımlılık enjeksiyon kaplarına yeni bir şekilde yeniyim, bu yüzden bariz bir şeyi özlüyorum.

Güncelleme: hata özel filtreleri ile ilgisi yok. Tüm süzgeçleri özel filtrelere kaldırırsam, hata davranışı hala yığın izlemesiyle aynı olur.

+0

? Autofac.MVC, istek sırasında yaratılan Lifetimscope'u içeren yeni bir 'RequestLifetimeHttpModule 'içerdiğinden,' ContainerDisposalModule 'gerekli olmamalıdır. – nemesv

+0

@nemesv aynı sonuç. – J0HN

+0

Tamam, şimdi sorunun ne olduğunu görüyorum ... 'InstancePerHttpRequest' ile kayıtlı hizmetleriniz var mı? – nemesv

cevap

6

Aslında iki hata var?

Hata # 1: LifeTimeScope s bağlı oluşturulan Request kayıtlı üzere Issue 351AutofacDependencyResolver ihtiyaçların düzeltmenin olarak yan etkisi AutoFac hangi bu davranışı neden olur. MVC entegrasyonu bunu yapar ancak Winforms entegrasyonu elbette olmaz.

Hata? # 2: Hem RequestLifetimeScopeProvider ve ContainerProvider depolar aynı anahtar HttpContext.Current.Items ile oluşturulan ILifetimeScope:

static ILifetimeScope LifetimeScope 
{ 
    get { return (ILifetimeScope)HttpContext.Current.Items[typeof(ILifetimeScope)]; } 
    set { HttpContext.Current.Items[typeof(ILifetimeScope)] = value; } 
} 

Yani biraz yarış durumu hangi modül ilk WebFormları veya MVC intergartion işletilirse bağlı çünkü burada var ILifetimeScope kazandı. Bu nedenle, WebForms modülü AutofacDependencyResolver değerini kazanırsa, kayıt olmaz ve hoş olmayan tanımlayıcı istisnası olur.

Düzeltme/Çözüm:

Ama bir basit çözümü vardır: Eğer sadece bu yüzden ne olursa olsun bir kazanç (MVC vs WebForm) AutofacDependencyResolver daima kayıtlı olacak ContainerProviderrequestLifetimeConfiguration yılında AutofacDependencyResolver kaydetmeniz gerekir :

Eğer `ContainerDisposalModule` açıklama olur ve bundan sonra` PropertyInjectionModule` ve `AttributedInjectionModule` yeniden etkinleştirmek ne
var autofacDependencyResolver = new AutofacDependencyResolver(container); 
DependencyResolver.SetResolver(autofacDependencyResolver); 
_containerProvider = new ContainerProvider(container, requestContainerBuilder => 
    requestContainerBuilder.RegisterInstance(autofacDependencyResolver) 
    .As<AutofacDependencyResolver>()); 
+0

Bir çekicilik gibi çalışır, çok teşekkür ederim. – J0HN

İlgili konular