Версия №2 для меня - легче всего увидеть, легче прочитать, легко увидеть, где начинается и заканчивается if, то же самое для других, вам не нужно беспокоиться о заключении в скобки, если вы хотите добавить более одного оператора.
Насколько я знаю, Unity разрешает только общедоступные свойства. Следовательно, ваша защищенная собственность не будет разрешена.
У меня тоже довольно мало опыта работы с Unity, но я думаю, что вам нужно зарегистрировать свой HomeController в contsaner, а не в регистраторе.
Я не уверен, связано ли это, но обычно я избегаю использования пространств имен и классов с одинаковыми именами (в вашем случае Logger.Logger), поскольку у меня были проблемы с этим в прошлое. Но проблема может быть не в этом.
Я также не уверен, работает ли атрибут [Dependency] для производных типов. Если вы измените его для внедрения конструктора, это все равно не сработает? Что-то вроде:
public class ApplicationController : Controller
{
protected ILogger _logger { get; set; }
public ApplicationController(ILogger logger)
{
this._logger = logger;
}
}
и
public class HomeController : ApplicationController
{
public HomeController(ILogger logger) : base(logger)
{
}
public ActionResult Index()
{
_logger.Log("Home controller constructor started.");
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
, а остальные точно так же. Код выглядит нормально.
У меня была такая же проблема, и я решил ее, изменив ILogger на общедоступный. Это связано с проектом ASP.NET MVC2 в VS2010, .NET 4. Логически это имеет смысл, поскольку Unity не создает прокси-класс или что-то еще, он просто устанавливает свойства, к которым у него есть доступ, и имеет сопоставление для - следовательно, только для публики.