2012-07-21 14 views
13

Düzenini kullanan her görünümde yapmak zorunda kalmamak için, paylaşılan düzen görünümü sayfasına bağımlılık enjekte etmeye çalışıyorum.Autofac, bağımlılıkları mizanpaj görünüm dosyalarına enjekte edebilir mi?

Bağımlılıkları görünümlere enjekte etmek için wiki'deki guidance izledim, ancak özellik her zaman boş.

Autofac, özellikleri bir düzen dosyası olan özel görünüm sayfasına enjekte edebilir mi?

İşte kurulumum. CustomViewPage

namespace MyApp 
{ 
    using System.Web.Mvc; 

    public abstract class CustomViewPage : WebViewPage 
    { 
     public IHelper Helper { get; set; } 
    } 
} 

~/Görüntüleme/Paylaşımlı/_Layout.cshtml

@inherits MyApp.CustomViewPage 
<!DOCTYPE html> 
<html> 
... 
@if(this.Helper.HasFoo()){@Html.ActionLink("Bar")} 

Küresel Kayıt ...

builder.RegisterType<Helper>().AsImplementedInterfaces(); 
builder.RegisterModelBinderProvider(); 
builder.RegisterFilterProvider(); 
builder.RegisterModule(new AutofacWebTypesModule()); 
builder.RegisterSource(new ViewRegistrationSource()); 
var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

kaynaklanıyor OLMAYAN düzeni kullanmak "çocuk" görünümleri CustomViewPage.

+3

Görünüşe göre bu bir "bilinen sorun" (http://code.google.com/p/autofac/issues/detail?id=349) Autofac ... – nemesv

+0

Evet sorun burada http: // kodu .google.com/p/autofac/issues/detail? id = 349 – GraemeMiller

+1

Bu cevap benim için bir geçici çözüm olarak çalıştı: http://stackoverflow.com/a/14935006/789683 – flipchart

cevap

1

Bu, yalnızca AutoFac ile temelde, yerleşimlerde DI'ye ulaşamazsınız. Bağımlılıkları gidermek için CustomViewPage numaralı IOC Kapsayıcısına başvurmanız gerekebilir.

REALYYY REQUYED sadece DI görünümlerinden kaçınılır (sadece fikrim).

Bakış açımdan çok yarar görmüyorum. Baz görünüm sayfası sınıfı için birim testleri yazmayacağınızı düşünüyorum sizce? özel bir neden olmadığı sürece sadece bundan kaçının. Konteynere bağımlı olmak yerine, somut uygulamalarla bağımlılıklara sahip olmak daha iyidir.

+3

Neden olabileceğine dair herhangi bir referans veya arka plan Düzenler halinde DI? – Josh

+0

@Josh yukarıda belirtildiği gibi, Bu benim düşüncem ve diğer pek çokları, ben sadece bunun en iyi fikir olmadığını söyleyemedim asla ... Yapmamamın birkaç nedeni, ünite testinin zorluğuna bağlı olarak, Hangi IoC kütüphanesi ile HttpContext'e konteynırı çözmek için erişmeniz gerekiyor ve muhtemelen görüşünüzün doğrudan bir servise konuştuğu ve dolayısıyla MVC modelini frenlediği bir durumda olacaksınız. Herkese herşeyi nasıl yaptıklarını söyleyemem ve bunu tekrar düşünmek istemediğini söyleyemem, tasarımını yeniden düşünmek ve daha iyi bir seçenek olmadığından emin olmak –

+0

@Joe_DM Düzenlemenizi yeni bir cevap olarak gönderebilir misiniz? ? – VJAI

0

Burada, çoğu DI çerçevesine göre çalışacak küçük bir çalışma var.

Önce biraz CustomPageView ayarlayın:

public abstract class CustomViewPage : WebViewPage 
{ 
    public IHelper Helper { 
     get { return ViewData[Helper.ViewDataKey] as IHelper; }  
    } 

} 

Şimdi sıra, ViewData içine dependancy almak gerekir bunu yapmak için bir öznitelik tanıtmak: size eylem yöntemi ya denetleyicisinde

public sealed class HelperAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     var viewResult = filterContext.Result as ViewResult; 
     if (viewResult != null) 
      viewResult.ViewData.Add(Helper.ViewDataKey, GetHelperFromIoC()); 

     base.OnResultExecuting(filterContext); 
    } 
} 

:

[Helper] 
public ActionResult Index() 
{ 
    return View(); 
} 

Ve görüşünüzde şimdi Yardımcınızı beklentilerinizi kullanabilmeniz gerekir. ted:

@Helper.HelloWorld() 

orijinal yazı için this blog bakınız.

15

çözümlerin çoğu DependencyResolver.Current.GetService çağrısı etrafında sarıcı olacak, yüzden düzeni doğrudan çağrı daha kolay olabilir: Ayrıca, bu yol sayfa modeli daha SRP hale getirmeye yardımcı olur

@{ 
    var helper = DependencyResolver.Current.GetService<IHelper>(); 
} 
... 
@if (helper.HasFoo()) { @Html.ActionLink("Bar") } 
... 

, çünkü servis rutinlerini/modellerini ve iş alanlarını karıştırmaktan kaçınabilir.

0

Hiçbir parametresiz sonuç için WebViewPage'inizi veri iletmek için genişletmeniz gerekmez. Bunu şu şekilde çözebilirim: 1. ActionFilter'dan türetilen bir HelperActionFilter sınıfı bildirin, hizmetinizi bu özelliğe http://docs.autofac.org/en/latest/integration/mvc.html aracılığıyla gönderin. 2. Inside HelperActionFilter.OnActionExecuting kurulumu ViewBag.HasFoo düzeni düzenleyin.

0

Sadece kısmi bir sayfa oluşturabilir ve düzeni sayfa sokun:

@Html.Partial("_MyPartialPage"); 

bağımlılıklar kısmi sayfaları içine enjekte edilir.

İlgili konular