Я размышлял над решением этой самой проблемы, и вот что я придумал:
Внедрите свои зависимости непосредственно в действия вашего контроллера, а не в конструктор контроллера. Таким образом, вы вводите только то, что вам нужно.
Я буквально только что взбил это, так что это немного наивно и не проверено на гнев, но я собираюсь реализовать это как можно скорее, чтобы попробовать. Предложения приветствуются!
Это, конечно, свойственно StructureMap, но вы можете легко использовать другой контейнер.
в global.asax:
protected void Application_Start()
{
ControllerBuilder.Current.SetControllerFactory(
new StructureMapControllerFactory());
}
вот структура mapcontrollerfactory:
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
try
{
var controller =
ObjectFactory.GetInstance(controllerType) as Controller;
controller.ActionInvoker =
new StructureMapControllerActionInvoker();
return controller;
}
catch (StructureMapException)
{
System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
throw;
}
}
}
и структура mapcontrolleractioninvoker (может быть более умным)
public class StructureMapControllerActionInvoker : ControllerActionInvoker
{
protected override object GetParameterValue(
ControllerContext controllerContext,
ParameterDescriptor parameterDescriptor)
{
object parameterValue;
try
{
parameterValue = base.GetParameterValue(
controllerContext, parameterDescriptor);
}
catch (Exception e)
{
parameterValue =
ObjectFactory.TryGetInstance(
parameterDescriptor.ParameterType);
if (parameterValue == null)
throw e;
}
return parameterValue;
}
}