На данный момент у меня есть пользовательская ControllerFactory, в которую я вставляю свой контейнер Unity:
в global.asax Application_Start ():
var container = InitContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
var factory = new UnityControllerFactory(container);
ControllerBuilder.Current.SetControllerFactory(factory);
В фабрике контроллеров я установил свойконтроллеры для использования собственного ActionInvoker, например, так:
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
var controller = base.GetControllerInstance(requestContext, controllerType) as Controller;
if (controller != null)
controller.ActionInvoker = new UnityActionInvoker(_container);
return controller;
}
Наконец, в своем пользовательском ActionInvoker я пытаюсь создать действия, вызываемые с помощью контейнера ActionInvokers:
protected override ActionExecutedContext InvokeActionMethodWithFilters(
ControllerContext controllerContext,
IList<IActionFilter> filters,
ActionDescriptor actionDescriptor,
IDictionary<string, object> parameters)
{
var builtUpFilters = new List<IActionFilter>();
foreach (IActionFilter actionFilter in filters)
{
builtUpFilters.Add(_container.BuildUp<IActionFilter>(actionFilter));
}
return base.InvokeActionMethodWithFilters(controllerContext, builtUpFilters, actionDescriptor, parameters);
}
Вот примеродин из создаваемых ActionFilters:
public class PopulatRolesAttribute : ActionFilterAttribute, IActionFilter
{
private const string RolesKey = "roles";
[Dependency]
public Func<IMetadataService> Service { get; set; }
public PopulatRolesAttribute()
{
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.Controller.ViewData[RolesKey] == null)
{
filterContext.Controller.ViewData[RolesKey] = Service().GetRoles();
}
}
}
Проблема в том, что открытое свойство в моем пользовательском атрибуте ActionFilterAttribute никогда не внедряется с чем-либо, оно остается нулевым при выполнении!Я не могу понять, почему мой фильтр неправильно собирается контейнером.Внедряемый тип регистрируется должным образом, например:
container.RegisterInstance(new ChannelFactory<IMetadataService>(
new BasicHttpBinding(),
new EndpointAddress("http://example.com/ABSApplication/MetadataService.svc")));
container.RegisterInstance<Func<IMetadataService>>(
() => container.Resolve<ChannelFactory<IMetadataService>>().CreateChannel());
И также внедряется в другом месте приложения (хотя и не через .Buildup).Это почти тот же процесс, за которым следует сообщение в блоге .Какой кусок головоломки мне не хватает?