2011-10-16 15 views
11

Próbuję automatycznie ustawić właściwość na dowolnym kontrolerze, który wywodzi się z mojej klasy BaseController. Oto kod w mojej metodzie Application_Start. Właściwość UnitOfWork jest zawsze pusta, gdy próbuję uzyskać do niej dostęp.Właściwość wtrysku dla kontrolera podstawowego Klasa

var builder = new ContainerBuilder(); 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 
builder.RegisterType<VesteraTechnologiesContext>().As<IContext>(); 
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>(); 
builder.RegisterType<BaseController>() 
     .OnActivated(c => c.Instance.UnitOfWork = c.Context.Resolve<IUnitOfWork>()); 
var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

Oto co BaseController wygląda

public class BaseController : Controller 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 
} 

Powodem Próbuję to zrobić za pośrednictwem nieruchomości zamiast na przez konstruktora jest tak, że nie trzeba powielać konstruktora w każdym kontrolerze, który potrzebuje dostępu do właściwości UnitOfWork, ponieważ konstruktory nie są dziedziczone.

Odpowiedz

14

Autofac domyślnie rejestruje kontrolerów użyć konstruktora wtrysku. Aby włączyć property injection with autofac: należy użyć:

builder.RegisterControllers(typeof(MvcApplication).Assembly) 
     .PropertiesAutowired(); 
+0

Dziękuję nemesv, to działało idealnie. –

+0

@nemesv dzięki za cynk. Czy wiesz, że jeśli ma to jakiś wpływ? – tugberk

+0

@tugberk Nie użyłem WłaściwościAutowired w środowisku produkcyjnym, więc nie wiem ile ma to wpływu na perfekcję. Korzysta z refleksji, aby znaleźć publicznie możliwe do ustawienia właściwości, tak więc ma co najmniej typowe koszty refleksji. – nemesv

-1

ponieważ konstruktory nie są dziedziczone.

Zazwyczaj jest to możliwe, aby wywołać konstruktor bazowy następująco:

public DescendantClass() 
    : base() 
{ 
} 
+0

PO musiałaby konstruktora z parametrem 'IUnitOfWork'. –

+0

GertArnold ma rację i wiem, że mogę kaskadować konstruktorów, ale tego właśnie próbuję uniknąć. Dzięki. –

+0

Niech ten konstruktor publiczny nic nie robi, chyba że również chce dostarczyć "domyślnego konstruktora" dla obiektu z nie-domyślnymi konstruktorami. Podstawowy konstruktor zostanie automatycznie wywołany przez niejawny "domyślny konstruktor". – user2246674

Powiązane problemy