创建引用 ActionFilters、HTTPContext、HTTPException 等的 .Net Standard 库
Creating a .Net Standard library referencing ActionFilters, HTTPContext , HTTPException etc
我有一堆 API 在 .Netcore 上创作的。我有一些要在所有 API 中使用的操作属性。我计划创建一个带有动作过滤器的标准库项目,并在所有 API 项目中引用相同的内容。但是,我不确定是否可以添加对 sytem.web 的引用。我收到一堆关于缺少属性的错误,并且无法找到 HTTPConext 和 HTTPException 类型。为 Web API 创建可重复使用的 actionfilter 属性的正确方法是什么?
有两种方法
1) 如果您的图书馆仅使用网络应用程序,您可以通过 nuget
添加到图书馆
Microsoft.AspNetCore.Mvc.Abstractions 过滤器
Microsoft.AspNetCore.Http.Abstractions 用于 HttpContext
并在您的库中使用 HttpContext 创建共享过滤器和其他操作
2) 使用DI。创建一些接口并在库中使用它,并在项目中创建它的实现 class。之后使用 DI 注入你的 class 这个接口将被调用的地方。
- 您可以在 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);
}
}
如果您想成为 ASP.NET Core 特定的,您应该去创建一个 Class 库 (.NET Core) 而不是 Class 库 (.NET Standard)。
我有一个博客 post 涵盖了每个项目模板的典型用法,
https://blog.lextudio.com/which-class-library-project-to-go-in-visual-studio-2015-2017-a48710cf3dff
我有一堆 API 在 .Netcore 上创作的。我有一些要在所有 API 中使用的操作属性。我计划创建一个带有动作过滤器的标准库项目,并在所有 API 项目中引用相同的内容。但是,我不确定是否可以添加对 sytem.web 的引用。我收到一堆关于缺少属性的错误,并且无法找到 HTTPConext 和 HTTPException 类型。为 Web API 创建可重复使用的 actionfilter 属性的正确方法是什么?
有两种方法
1) 如果您的图书馆仅使用网络应用程序,您可以通过 nuget
添加到图书馆Microsoft.AspNetCore.Mvc.Abstractions 过滤器
Microsoft.AspNetCore.Http.Abstractions 用于 HttpContext
并在您的库中使用 HttpContext 创建共享过滤器和其他操作
2) 使用DI。创建一些接口并在库中使用它,并在项目中创建它的实现 class。之后使用 DI 注入你的 class 这个接口将被调用的地方。
- 您可以在 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);
}
}
如果您想成为 ASP.NET Core 特定的,您应该去创建一个 Class 库 (.NET Core) 而不是 Class 库 (.NET Standard)。
我有一个博客 post 涵盖了每个项目模板的典型用法,
https://blog.lextudio.com/which-class-library-project-to-go-in-visual-studio-2015-2017-a48710cf3dff