如何确定 NET Core class 库在桌面或 Web 应用程序的上下文中是否为 运行
How to determine if a NET Core class library is running in the context of a desktop or web application
我有一个 .NET Core class 库,它提供的功能可供桌面和 Web 应用程序使用。我希望尽可能多地支持 .NET Core 支持的平台。
当 运行 在 Web 应用程序的上下文中时,我希望库能够检测托管应用程序的域。通常,我会使用 HttpContext.Request
对象来执行此操作,通过注入 IHttpContextAccessor
使上下文可用。但是,桌面应用程序没有 HttpContext
。
有没有什么方法可以注入服务,以便在无法提供服务时引用在消费者中为空?
如果该应用程序由桌面应用程序使用,则在收到请求时将无法像使用 Web 应用程序那样使用 HttpContext,因此我们需要解决方法。
鉴于您在应用程序中遵循命名约定,我建议使用反射并读取应用程序名称
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
这应该有效。
所以,最后,在依赖注入配置中,我测试了默认的 AspNet Core HttpContextAccessor
是否存在,如果不存在,我传入一个带有空 HttpContext 的假对象。
public void ConfigureServices(IServiceCollection services)
{
...
var accessorType = GetAccessorType() ?? typeof(NullOpHttpAccessor);
services.TryAddSingleton(typeof(IHttpContextAccessor), accessorType);
...
}
private static Type GetAccessorType()
{
var interfaceType = typeof(IHttpContextAccessor);
var excludedNames = new[] { "IHttpContextAccessor", "NullOpHttpAccessor" };
var type = AppDomain.CurrentDomain.GetAssemblies()
.AsEnumerable()
.SelectMany(a => a.GetTypes())
.FirstOrDefault(t => !excludedNames.Contains(t.Name) &&
interfaceType.IsAssignableFrom(t));
return type;
}
internal class NullOpHttpAccessor : IHttpContextAccessor
{
public HttpContext HttpContext { get => null; set => value = null; }
}
然后,在我的库中,我注入 HttpContextAccessor
,测试上下文是否为空,然后进行相应处理。
internal string DoStuff()
{
if (HttpContextAccessor.HttpContext == null)
{
return GetMacAddress();
}
return HttpContextAccessor.HttpContext.Request.Host.ToString();
}
我有一个 .NET Core class 库,它提供的功能可供桌面和 Web 应用程序使用。我希望尽可能多地支持 .NET Core 支持的平台。
当 运行 在 Web 应用程序的上下文中时,我希望库能够检测托管应用程序的域。通常,我会使用 HttpContext.Request
对象来执行此操作,通过注入 IHttpContextAccessor
使上下文可用。但是,桌面应用程序没有 HttpContext
。
有没有什么方法可以注入服务,以便在无法提供服务时引用在消费者中为空?
如果该应用程序由桌面应用程序使用,则在收到请求时将无法像使用 Web 应用程序那样使用 HttpContext,因此我们需要解决方法。
鉴于您在应用程序中遵循命名约定,我建议使用反射并读取应用程序名称
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
这应该有效。
所以,最后,在依赖注入配置中,我测试了默认的 AspNet Core HttpContextAccessor
是否存在,如果不存在,我传入一个带有空 HttpContext 的假对象。
public void ConfigureServices(IServiceCollection services)
{
...
var accessorType = GetAccessorType() ?? typeof(NullOpHttpAccessor);
services.TryAddSingleton(typeof(IHttpContextAccessor), accessorType);
...
}
private static Type GetAccessorType()
{
var interfaceType = typeof(IHttpContextAccessor);
var excludedNames = new[] { "IHttpContextAccessor", "NullOpHttpAccessor" };
var type = AppDomain.CurrentDomain.GetAssemblies()
.AsEnumerable()
.SelectMany(a => a.GetTypes())
.FirstOrDefault(t => !excludedNames.Contains(t.Name) &&
interfaceType.IsAssignableFrom(t));
return type;
}
internal class NullOpHttpAccessor : IHttpContextAccessor
{
public HttpContext HttpContext { get => null; set => value = null; }
}
然后,在我的库中,我注入 HttpContextAccessor
,测试上下文是否为空,然后进行相应处理。
internal string DoStuff()
{
if (HttpContextAccessor.HttpContext == null)
{
return GetMacAddress();
}
return HttpContextAccessor.HttpContext.Request.Host.ToString();
}