具有依赖注入的过滤器和 FilterProvider;管理每个请求?
Filters and FilterProvider with Dependency Injection; Manage Per-request?
我一直在尝试使用 Unity 和客户 Filter
/ FilterProvider
。我担心的是 classes 永远不会被处理掉。这是我开始的代码示例:
//FilterProvider
public class CustomFilterProvider: IFilterProvider
{
public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
{
if (actionDescriptor.GetCustomAttributes<CustomAuthorizeAttribute>().Any())
{
var filter = UnityinstanceLocator.GetConfiguredContainer().Resolve<CustomAuthorize>();
yield return new FilterInfo(filter, FilterScope.Global);
}
}
}
//Filter
public class CustomAuthorizeFilter: IAuthorizationFilter
{
private readonly IFakeService _fakeService;
public CustomAuthorizeFilter(IFakeService fakeService)
{
_fakeService = fakeService;
}
public bool AllowMultiple { get; }
public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken,
Func<Task<HttpResponseMessage>> continuation)
{
...Do Some stuff
}
}
//Attribute
public class CustomAuthorizeAttribute : Attribute
{
}
我的 IFakeService
实现了 IDisposable
。我将其设置为测试。我对 IFakeService
的统一注册使用了 HierarchicalLifetimeManager
。当它在过滤器内时,我从来没有看到它被处理掉。将 IFakeService
注入控制器会按预期工作。
过滤器提供程序的启动如下所示(我使用的是 OWIN):
var config = new HttpConfiguration {DependencyResolver = new UnityDependencyResolver(UnityinstanceLocator.GetConfiguredContainer())};
config.Services.Add(typeof(IFilterProvider), new ComceptFilterProvider());
我想我可以老老实实把我的一次性 class 包装在 ExecuteAuthorizationFilterAsync
方法内的 using
语句中,并一起避免依赖注入。如果我继续使用 Unity,是否有更好的解决方案?
在 WebApi 框架中缓存过滤器。所以它们是 singletons 并在请求中重复使用。 CustomAuthorizeFilter
的实例在应用程序的生命周期内永远不会被处置,并保留对 IFakeService
.
的引用
我一直在尝试使用 Unity 和客户 Filter
/ FilterProvider
。我担心的是 classes 永远不会被处理掉。这是我开始的代码示例:
//FilterProvider
public class CustomFilterProvider: IFilterProvider
{
public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
{
if (actionDescriptor.GetCustomAttributes<CustomAuthorizeAttribute>().Any())
{
var filter = UnityinstanceLocator.GetConfiguredContainer().Resolve<CustomAuthorize>();
yield return new FilterInfo(filter, FilterScope.Global);
}
}
}
//Filter
public class CustomAuthorizeFilter: IAuthorizationFilter
{
private readonly IFakeService _fakeService;
public CustomAuthorizeFilter(IFakeService fakeService)
{
_fakeService = fakeService;
}
public bool AllowMultiple { get; }
public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken,
Func<Task<HttpResponseMessage>> continuation)
{
...Do Some stuff
}
}
//Attribute
public class CustomAuthorizeAttribute : Attribute
{
}
我的 IFakeService
实现了 IDisposable
。我将其设置为测试。我对 IFakeService
的统一注册使用了 HierarchicalLifetimeManager
。当它在过滤器内时,我从来没有看到它被处理掉。将 IFakeService
注入控制器会按预期工作。
过滤器提供程序的启动如下所示(我使用的是 OWIN):
var config = new HttpConfiguration {DependencyResolver = new UnityDependencyResolver(UnityinstanceLocator.GetConfiguredContainer())};
config.Services.Add(typeof(IFilterProvider), new ComceptFilterProvider());
我想我可以老老实实把我的一次性 class 包装在 ExecuteAuthorizationFilterAsync
方法内的 using
语句中,并一起避免依赖注入。如果我继续使用 Unity,是否有更好的解决方案?
在 WebApi 框架中缓存过滤器。所以它们是 singletons 并在请求中重复使用。 CustomAuthorizeFilter
的实例在应用程序的生命周期内永远不会被处置,并保留对 IFakeService
.