Часто бывает так, что я хочу иметь несколько конструкторов в моих контроллерах, поскольку один из конструкторов оптимален для ручного внедрения зависимостей во время модульного тестирования, а другой - для использования контейнера IOC для внедрения зависимостей.
При использовании стандартного сервисного локатора или DependencyResolver в MVC 3, есть ли способ указать фабрике контроллеров, какой конструктор использовать при активации контроллера?
Я бы предпочел не использовать один из атрибутов, специфичных для инфраструктуры IOC, поскольку я хочу, чтобы код оставался независимым от контейнера IOC.
UPDATE:
Кажется, что большинство ответов указывают на плохую практику иметь несколько конструкторов. Я не совсем не согласен с этим, однако, ситуация возникает в результате попытки найти хорошее решение для слоя картографирования / преобразования, которое я задавал в этом вопросе , но никогда не получал хорошего ответа на .
Мой код будет выглядеть так:
public class SomeController : Controller
{
private ISomeService _SomeService;
private IEntityConverter _EntityConverter;
// this would be used during unit tests when mocking the entity converter
public SomeController(ISomeService someService, IEntityConverter entityConverter)
{
_SomeService = someService;
_EntityConverter = entityConverter;
}
// this would be used when injecting via an IOC container, where it would be tedious
// to always specify the implementations for the converters
public SomeController(ISomeService someService)
: this(someService, new EntityConverter())
{
}
public ActionResult Index(SomeViewModel someViewModel)
{
if (!ModelState.IsValid)
return View(someViewModel);
else
{
ServiceInput serviceInput = _EntityConverter.ConvertToServiceInput(someViewModel);
_SomeService.DoSomething(serviceInput);
return View("Success");
}
}
}
В этом очень простом примере я использую интерфейс для преобразования между моими моделями представлений и сущностями, которые являются входными данными для уровня обслуживания.
Я бы предпочел использовать интерфейс, потому что это преобразование можно смоделировать, а не использовать статический метод. Однако я чувствую, что было бы утомительно всегда указывать в контейнере IOC, каковы реализации для этих реализаций преобразования, поскольку реализации для этих интерфейсов преобразования располагаются прямо рядом с интерфейсами.
Возможно, это не лучшее решение. Я открыт для лучших альтернатив.