Unity [dependency] injection and Inheritance

c#, dependency-injection, inheritance, unity-container

Solution

AFAIK, Unity will only resolve public properties. Therefore your protected property will not be resolved.

Problem

My question is as follows: I have a base controller (ASP.Net MVC controller) called ApplicationController, and I want all my controller to inherit from it. this base controller has a ILogger property, marked with a [Dependency] attribute. (yes, I know I should use constructor injection, I'm just curious about this attribute). I created the container, registered types, changed the default factory, everything is fine. the problem is that when I try to use my Logger property in the derived controller, it's not resolved. what am I doing wrong? why doesn't the container resolves the base class dependencies when creating the derived controller? code samples: ApplicationController: ``` public class ApplicationController : Controller { [Dependency] protected ILogger _logger { get; set; } } ``` derived controller: ``` public class HomeController : ApplicationController { public HomeController() { } public ActionResult Index() { _logger.Log("Home controller constructor started."); ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } public ActionResult About() { return View(); } } ``` Unity controller factory: ``` public class UnityControllerFactory : DefaultControllerFactory { private readonly IUnityContainer _container; public UnityControllerFactory(IUnityContainer container) { _container = container; } protected override IController GetControllerInstance(Type controllerType) { return _container.Resolve(controllerType) as IController; } } ``` Global.asax.cs sample: ``` protected void Application_Start() { _container = new UnityContainer(); _container.RegisterType<ILogger, Logger.Logger>(); UnityControllerFactory factory = new UnityControllerFactory(_container); ControllerBuilder.Current.SetControllerFactory(factory); RegisterRoutes(RouteTable.Routes); } ``` I'm quite new to Unity, so maybe I did something wrong. thanks, Ami.

Original source