我在 asp.net mvc web api 中的操作上有一个自定义 AuthorizeAttribute。我需要将我的 EF ObjectContext 注入其中。
开发服务器启动后的第一个请求始终有效。以下是失败的。ObjectContext 已被处理,对于我的生活,我无法弄清楚如何为每个请求注入该死的东西。
这是我的 FilterProvider。
public class UnityFilterAttributeFilterProvider : IFilterProvider
{
public UnityFilterAttributeFilterProvider(IUnityContainer container)
{
_container = container;
}
private IUnityContainer _container;
public IEnumerable<Filter> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
{
if (configuration == null)
{
throw Error.ArgumentNull("configuration");
}
if (actionDescriptor == null)
{
throw Error.ArgumentNull("actionDescriptor");
}
IEnumerable<Filter> first =
actionDescriptor.ControllerDescriptor.ControllerType.GetCustomAttributes(true)
.Select(instance => new Filter((IFilter)instance, FilterScope.Controller));
IEnumerable<Filter> second =
from instance in actionDescriptor.GetFilters()
select new Filter(instance, FilterScope.Action);
foreach (var filter in first.Concat(second))
{
if (filter.Instance is HeroineAuthorizeAttribute)
_container.BuildUp(filter.Instance as HeroineAuthorizeAttribute);
}
return first.Concat(second);
}
}
_container.BuildUp 在第一次请求时被调用,但在后续请求中不会被调用。
当这不起作用时,我加倍使用 ApiControllerActionInvoker。这里是:
public class InjectingActionInvoker : ApiControllerActionInvoker
{
private readonly IUnityContainer _container;
public InjectingActionInvoker(IUnityContainer container)
{
_container = container;
}
public override System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
{
foreach (var filter in actionContext.ActionDescriptor.GetFilters())
{
if (filter is HeroineAuthorizeAttribute)
{
var f = filter as HeroineAuthorizeAttribute;
f.UserRepository = _container.Resolve<IUserRepository>();
}
}
return base.InvokeActionAsync(actionContext, cancellationToken);
}
}
果然,注入发生在第一个请求上,而不是随后的。但这一切都发生在调用 OnAuthorization 之后,所以没有多大意义。我想我还是会提到它。
嗯...那我该怎么做呢?
我只是想我也会展示我的 Application_start 。我相信你可以填空。
var container = CoinUnityContainerFactory.GetUnityContainer();
DependencyResolver.SetResolver(new HeroineDependencyResolver(container));
GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new HeroineServiceResolver(container));