【发布时间】:2016-08-26 13:07:52
【问题描述】:
在我们的一个应用程序中,我已经在使用 AppTenant 类的依赖注入,如下所示
public void ConfigureServices(IServiceCollection services)
{
services.AddMultitenancy<AppTenant, CachingAppTenantResolver>();
services.Configure<MultitenancyOptions>(Configuration.GetSection("Multitenancy"));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseMultitenancy<AppTenant>();
}
在控制器中,我可以按如下方式轻松访问它
public AccountController(AppTenant tenant)
{
this.tenant = tenant;
}
现在,我想在同一解决方案的其他项目类中访问相同的 AppTenant 或 HttpContext。
所以,我试过这样
public SqlStringLocalizerFactory(
AppTenant tenant)
{
_tenant = tenant;
}
但它即将为空,所以我需要做什么才能在另一个项目类中获得 AppTenant 或 HttpContext ?
对于SqlStringLocalizerFactory 类,服务是用ConfigureServices 方法编写的,如下所示
public static class SqlLocalizationServiceCollectionExtensions
{
public static IServiceCollection AddSqlLocalization(this IServiceCollection services)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
return AddSqlLocalization(services, setupAction: null);
}
public static IServiceCollection AddSqlLocalization(
this IServiceCollection services,
Action<SqlLocalizationOptions> setupAction)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
services.TryAdd(new ServiceDescriptor(
typeof(IStringExtendedLocalizerFactory),
typeof(SqlStringLocalizerFactory),
ServiceLifetime.Singleton));
services.TryAdd(new ServiceDescriptor(
typeof(IStringLocalizerFactory),
typeof(SqlStringLocalizerFactory),
ServiceLifetime.Singleton));
services.TryAdd(new ServiceDescriptor(
typeof(IStringLocalizer),
typeof(SqlStringLocalizer),
ServiceLifetime.Singleton));
if (setupAction != null)
{
services.Configure(setupAction);
}
return services;
}
}
我什至尝试过IHttpContextAccessor,但仍然没有成功。
对此的任何帮助表示赞赏!
【问题讨论】:
-
您是否将
IHttpContextAccessor配置/添加到服务中。它不会自动添加。您必须手动添加它才能让服务知道它。即services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); -
您已将
SqlStringLocalizerFactory注册为singleton,因此在您的应用程序的整个生命周期中只有一个。单例生活方式与HttpContext的生命周期不匹配,HttpContext的生命周期是每个请求,并留下一个强制依赖。 -
@Nkosi 是的,我已经添加并在课堂上写为
private IHttpContextAccessor _contextAccessor public SqlStringLocalizerFactory( IHttpContextAccessor contextAccessor) -
@qujck 那么我需要如何注册
SqlStringLocalizerFactoryclass 呢?与AddScoped或AddTransient? -
@Rohit 抱歉,我帮不了你,我没有投资 .NET Core DI
标签: c# dependency-injection asp.net-core asp.net-core-mvc asp.net-core-1.0