创建一个引用ActionFilters,HTTPContext,HTTPException等的.Net标准库

时间:2017-12-09 06:48:16

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

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

2 个答案:

答案 0 :(得分:2)

有两种方式

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

添加到图书馆

Microsoft.AspNetCore.Mvc.Abstractions for filters

HttpContext的Microsoft.AspNetCore.Http.Abstractions

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

2)使用DI。创建一些接口并在库中使用它并在Projects中创建它的实现类。之后使用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 Project中实现接口(这应该在每个项目中实现)

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);
      }
}

答案 1 :(得分:0)

如果您希望特定于ASP.NET Core,则应该创建一个类库(.NET Core)而不是类库(.NET Standard)。

我有一篇博文,内容涵盖了每个项目模板的典型用法,

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