如何确定 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();
}