2011-10-16 20 views
11

Estoy tratando de establecer automáticamente una propiedad en cualquier controlador que se deriva de mi clase BaseController. Aquí está el código en mi método Application_Start. La propiedad UnitOfWork siempre es nula cuando intento acceder a ella.Inyección de propiedad para la clase de controlador base

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

Aquí es lo que el BaseController parece

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

La razón por la que estoy tratando de hacerlo a través de una propiedad en lugar de a través de un constructor es por lo que yo no tengo que duplicar el constructor en cada controlador que necesita acceso a la propiedad UnitOfWork, ya que los constructores no se heredan.

Respuesta

14

Autofac por defecto registra los controladores de usar la inyección de constructor. Para habilitar property injection with autofac: debe usar:

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

Gracias nemesv, esto funcionó a la perfección. –

+0

@nemesv gracias por la sugerencia. ¿Sabes que si esto tiene algún impacto en el rendimiento? – tugberk

+0

@tugberk No he usado PropertiesAutowired en un entorno de producción, así que no sé cuánto impacto tiene. Utiliza la reflexión para encontrar las propiedades configurables públicas, por lo que tiene al menos los costos de reflexión habituales. – nemesv

-1

ya que los constructores no se heredan.

lo general, es posible llamar al constructor base de la siguiente manera:

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

El OP necesitaría un constructor con un parámetro 'IUnitOfWork'. –

+0

GertArnold es correcto, y sé que puedo conectar en cascada los constructores, pero esto es lo que trato de evitar. Gracias. –

+0

Tener un constructor público como este no hace nada a menos que también desee proporcionar un "constructor predeterminado" para un objeto con constructores no predeterminados. El constructor base será llamado automáticamente por el "constructor predeterminado" implícito. – user2246674

Cuestiones relacionadas