我有一个configurationservice类,该类被注入" _viewimports":
@inject IConfigurationService ConfigurationService
我在每个视图页面中访问它,如下所示:
@{
// Configurations
var configuration = await ConfigurationService.GetGeneralConfiguration();
var currencySymbol = configuration.Currency.Symbol;
}
这有效,但是我必须在每个页面中复制并粘贴代码。我尝试在_Layout.cshtml
中编写代码,但它不起作用。静态var也无法使用,因为值不是静态的 - 对于每个请求,我都会获得当前的用户配置并注入页面。而且,对于所有需要currencySymbol
变量值的页面,我需要粘贴代码,而我不想这样做。
我的问题是:如何将变量声明,例如_Layout.cshtml
或_ViewStart.cshtml
或所有其他视图,所有剃须刀视图页面都可以访问,例如继承。这些变量必须包含配置服务值。
而不是创建变量,最好注入一个服务,该服务将根据需要生成所需的值。例如:
public interface ILocalisationService
{
string CurrencySymbol { get; }
}
public class LocalisationService : ILocalisationService
{
private IConfigurationService _configurationService;
private string _currencySymbol;
public LocalisationService(IConfigurationService configurationService)
{
_configurationService = configurationService;
}
public string CurrencySymbol => string.IsNullOrEmpty(_currencySymbol)
? _currencySymbol = _configurationService.GetValue("£")
: _currencySymbol;
}
现在注入新服务:
@inject ILocalisationService LocalisationService
并在您的视图中使用它:
The currency symbol is @LocalisationService.CurrencySymbol
这样的好处是,当您的视图不使用一个值时,它不需要计算,如果花费很长时间,这尤其重要。