2011-10-16 20 views
11

Sto tentando di impostare automaticamente una proprietà su qualsiasi controller che deriva dalla classe BaseController. Ecco il codice nel mio metodo Application_Start. La proprietà UnitOfWork è sempre nullo quando provo ad accedervi.Proprietà dell'iniezione per controller di base Classe

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

Ecco ciò che il BaseController assomiglia

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

La ragione per cui sto cercando di fare questo tramite una proprietà invece attraverso un costruttore è così che non ho duplicare il costruttore in ogni controller che necessita dell'accesso alla proprietà UnitOfWork, poiché i costruttori non vengono ereditati.

risposta

14

Autofac predefinita registra i controllori di utilizzare iniezione del costruttore. Per abilitare property injection with autofac: dovresti usare:

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

Grazie nemesv, questo ha funzionato perfettamente. –

+0

@nemesv grazie per il suggerimento. Sai che se questo ha un impatto perfetto? – tugberk

+0

@tugberk Non ho usato PropertiesAutowired in un ambiente di produzione, quindi non so quanto abbia un impatto perfetto. Usa la riflessione per trovare le proprietà pubbliche impostabili in modo che abbia almeno i soliti costi di riflessione. – nemesv

-1

poiché i costruttori non sono ereditati.

solito, è possibile richiamare il costruttore di base come segue:

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

L'OP avrebbe bisogno di un costruttore con un parametro 'IUnitOfWork'. –

+0

GertArnold è corretto, e so che posso mettere in cascata i costruttori, ma questo è quello che sto cercando di evitare. Grazie. –

+0

Un costruttore pubblico come questo non fa nulla a meno che non voglia fornire un "costruttore predefinito" per un oggetto con costruttori non predefiniti. Il costruttore base verrà chiamato automaticamente dal "costruttore predefinito" implicito. – user2246674

Problemi correlati