Я тоже сталкивался с этой проблемой и теперь у меня есть рабочее решение. Это похоже на решение, описанное выше, но с некоторыми небольшими отличиями, а также с добавлением полного кода Unity.
Сначала я буду использовать внедрение свойств по причине, описанной выше, и, как и выше, я буду использовать метод BuildUp в Unity для внедрения свойств в уже созданные фильтры.
Для этого все мои контроллеры наследуются от нового пользовательского базового класса. В этом базовом классе я переопределяю метод CreateActionInvoker, чтобы установить свой собственный ActionInvoker.
Protected Overrides Function CreateActionInvoker() As System.Web.Mvc.IActionInvoker
Return CustomActionInvoker
End Function
Затем в моем CustomActionInvoker я переопределяю метод GetFilters.
Protected Overrides Function GetFilters(ByVal controllerContext As ControllerContext, ByVal actionDescriptor As ActionDescriptor) As FilterInfo
Dim info = MyBase.GetFilters(controllerContext, actionDescriptor)
For Each MyAuthorizationFilter In info.AuthorizationFilters
MvcApplication.Container.BuildUp(MyAuthorizationFilter.GetType, MyAuthorizationFilter)
Next
For Each MyActionFilter In info.ActionFilters
MvcApplication.Container.BuildUp(MyActionFilter.GetType, MyActionFilter)
Next
For Each MyResultFilter In info.ResultFilters
MvcApplication.Container.BuildUp(MyResultFilter.GetType, MyResultFilter)
Next
For Each MyExceptionFilter In info.ExceptionFilters
MvcApplication.Container.BuildUp(MyExceptionFilter.GetType, MyExceptionFilter)
Next
Return info
End Function
Вопреки сказанному выше, я не обнаружил, что выполнение наращивания внутри цикла For Each вызывало какие-либо проблемы. Я также преодолел первоначальную проблему, состоящую в том, чтобы ссылаться на объект только через интерфейс, используя одну из других перегрузок метода BuildUp, который принимает System.Type, а также существующий объект.
Теперь, когда все вышеперечисленное сделано, я могу вставлять зависимости прямо в мои Фильтры.
Любые комментарии и мысли очень ценятся.
ура Майк