【问题标题】:Creating a .Net Standard library referencing ActionFilters, HTTPContext , HTTPException etc创建一个引用 ActionFilters、HTTPContext、HTTPException 等的 .Net 标准库
【发布时间】:2018-05-23 09:25:08
【问题描述】:

我在 .Netcore 上编写了一堆 API。我有一些我想在所有 API 中使用的操作属性。我计划创建一个带有操作过滤器的标准库项目,并在所有 API 项目中引用相同的内容。但是,我不确定是否可以添加对 sytem.web 的引用。我收到一堆关于缺少属性的错误,并且无法找到 HTTPConext 和 HTTPException 类型。为 Web API 创建可重用的 actionfilter 属性的正确方法是什么?

【问题讨论】:

    标签: c# asp.net asp.net-core class-library


    【解决方案1】:

    有两种方法

    1) 如果您的库仅使用网络应用程序,您可以通过 nuget 添加到库中

    Microsoft.AspNetCore.Mvc.Abstractions 过滤器

    用于 HttpContext 的 Microsoft.AspNetCore.Http.Abstractions

    并在您的库中使用 HttpContext 创建共享过滤器和其他操作

    2) 使用 DI。创建一些接口并在库中使用它并在项目中创建它的实现类。之后使用 DI 注入你的类,这个接口将被调用。

    • 您可以在 Desktop\Web 或任何应用程序中使用它 +
    • 不需要库 +
    • 您不依赖任何版本的 API +
    • 过滤器不起作用 -
    • 您需要在每个项目中实现您的接口 -

    示例从 .Net 标准库中的服务中的 HttpContext 获取 cookie

    public interface ICookieAccessor
    {
         string GetCookieValueByName(string name);
    }
    
    public class SomeServiceThatUsesCookie()
    {
         private readonly ICookieAccessor _cookieAccessor;
    
         public SomeServiceThatUsesCookie(ICookieAccessor cookieAccessor){
               _cookieAccessor = cookieAccessor;
         }
    
         public string IWonnaCookie(string name){
               return _cookieAccessor.GetCookieValueByName(name);
         }
    }
    

    并在 Web 项目中实现接口(每个项目中都应该实现)

    public class CookieAccessor: ICookieAccessor
    {
             private readonly IHttpContextAccessor _httpContext;
    
             public class CookieAccessor(IHttpContextAccessor httpContext){
                    _httpContext = httpContext;
             }
    
             public string GetCookieValueByName(string name){
                    if (_httpContext.HttpContext.Request.Cookies.TryGetValue(name, 
                                                                  out var value))
                    {
                           return value;
                     }
                     return null;
             }
    }
    

    并将其注入到您的 WebApps 启动文件 ConfigureServices 方法中

    services.AddTransient<ICookieAccessor, CookieAccessor>();
    services.AddTransient<SomeServiceThatUsesCookie>();
    

    比在某些控制器中使用您的服务

    public class SomeContoller: Controller
    {
          private readonly SomeServiceThatUsesCookie _someService;
    
          public SomeContoller(SomeServiceThatUsesCookie someService){
                 _someService = someService;
          }
    
          public string GetCookieValue(string name){
                 return _someService.IWonnaCookie(name);
          }
    }
    

    【讨论】:

    • 我将选择您的第一个选项,并且能够访问必要的类型。
    【解决方案2】:

    如果你想成为 ASP.NET Core 特定的,你应该去创建一个类库 (.NET Core) 而不是类库 (.NET Standard)。

    我有一篇博文介绍了每个项目模板的典型用法,

    https://blog.lextudio.com/which-class-library-project-to-go-in-visual-studio-2015-2017-a48710cf3dff

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      相关资源
      最近更新 更多