【问题标题】:Filters and FilterProvider with Dependency Injection; Manage Per-request?具有依赖注入的过滤器和过滤器提供者;管理每个请求?
【发布时间】:2017-08-12 17:11:34
【问题描述】:

我一直在使用 Unity 和一位客户 Filter / FilterProvider 进行试验。我担心的是这些课程永远不会被处置。这是我开始的一个代码示例:

//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());

我想我可以去老学校,将我的一次性类包装在 ExecuteAuthorizationFilterAsync 方法内的 using 语句中,并一起避免依赖注入。如果我继续使用 Unity,是否有更好的解决方案?

【问题讨论】:

  • 如何注入一个 FakeServiceFactory 并使用它来创建一个 FakeService - 您可以在实际使用它的 using 块中使用它。

标签: c# .net asp.net-web-api dependency-injection unity-container


【解决方案1】:

在 WebApi 框架中,过滤器被缓存。所以它们是singletons 并在请求之间重用。 CustomAuthorizeFilter 的实例在应用程序的生命周期内永远不会被释放,并保持对 IFakeService 的引用。

【讨论】:

  • 在我准备好迁移到 .Net Core 并使用 ServiceFilterAttribute 之前,我将不得不接受一个更简单的解决方案,并在没有 DI 的情况下直接使用我的底层上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2015-10-17
相关资源
最近更新 更多