c# - 创建引用 ActionFilters、HTTPContext、HTTPException 等的 .Net Standard 库

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

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

最佳答案

有两种方式

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

过滤器的 Microsoft.AspNetCore.Mvc.Abstractions

HttpContext 的 Microsoft.AspNetCore.Http.Abstractions

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

2)使用DI。创建一些接口(interface)并在库中使用它并在项目中创建它的实现类。之后,使用 DI 将您的类注入(inject)到将调用此接口(interface)的位置。

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

  • 示例从 .Net Standard 库中服务中的 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 项目中实现接口(interface)(这应该在每个项目中实现)
    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;
             }
    }
    

    并将其注入(inject)您的 WebApps 启动文件 ConfigureServices 方法
    services.AddTransient<ICookieAccessor, CookieAccessor>();
    services.AddTransient<SomeServiceThatUsesCookie>();
    

    比在某些 Controller 中使用您的服务
    public class SomeContoller: Controller
    {
          private readonly SomeServiceThatUsesCookie _someService;
    
          public SomeContoller(SomeServiceThatUsesCookie someService){
                 _someService = someService;
          }
    
          public string GetCookieValue(string name){
                 return _someService.IWonnaCookie(name);
          }
    }
    

    关于c# - 创建引用 ActionFilters、HTTPContext、HTTPException 等的 .Net Standard 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47726098/

    相关文章:

    c# - 过滤 DataGridView

    asp.net - PostBackUrl 在 Html 按钮上不可用

    c# - ASP.Net Core Serilog 如何在运行时读取日志文件

    javascript - 在另一个 ViewComponent 中调用一个 ViewComponent

    c# - 如何增加或减少 C# 中的标记值?

    c# - 通过网页发送 Outlook 电子邮件

    c# - 如何读取json数据

    asp.net - 正确构建 Asp.net 页面代码

    c# - 我们可以在不改变url的情况下改变页面的内容吗?

    c# - .NET Core 2.1 : AddHsts() and AddHttpsRedirection() not defined