我有一个实现IValidatableObject的模型,我需要本地化ValidationResults,我该如何正确实现呢?
目前我想出了一个IValidatableObject.Validate方法,如下所示:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var stringLocalizer = validationContext.GetService(typeof(IStringLocalizer<MyModel>)) as IStringLocalizer<MyModel>;
//Validation logic implementation...
yield return new ValidationResult(stringLocalizer["This thing is the error message"]);
}
Run Code Online (Sandbox Code Playgroud)
我在这里做的是使用ValidationContext.GetService方法定位IStringLocalizer实例.
这种方法有效,但我的主要问题是我不完全确定这是正确的,特别是因为我需要依赖服务定位器来获取IStringLocalizer
在初始化应用程序主机之前,我需要从应用程序的配置中读取一些设置以进行其他设置。
在ASP.NET Core 2.x中,在初始化应用程序主机之前读取设置,我曾用来执行以下操作:
public static void Main(string[] args)
{
//...
var configuration = new ConfigurationBuilder()
.AddEnvironmentVariables()
.AddCommandLine(args)
.AddJsonFile("appsettings.json")
.Build();
//Do something useful with the configuration...
var host = WebHost.CreateDefaultBuilder()
.UseStartup<Startup>()
.UseConfiguration(configuration)
.Build();
//...
}
Run Code Online (Sandbox Code Playgroud)
在ASP中,WebHost 不建议使用 .NET Core 3.x ,而应使用.NET Generic Host。
.NET通用主机只有一个.ConfigureHostConfiguration(),.ConfigureAppConfiguration()并且不将内置配置作为参数,而是仅接受用于设置配置的委托。
对于HTTP工作负载,您仍然可以使用该方法.UseConfiguration()公开的方法,IWebHostBuilder并且基本上与以前相同:
public static void Main(string[] args)
{
//...
var configuration = new ConfigurationBuilder()
.AddEnvironmentVariables()
.AddCommandLine(args)
.AddJsonFile("appsettings.json")
.Build();
//Do something useful with the configuration...
var host = …Run Code Online (Sandbox Code Playgroud) 我在决定如何强制性地触发API调用时遇到麻烦,例如,单击按钮时。
我不确定使用钩子的正确方法是什么,因为似乎不止一种方法,但是我不知道哪种方法是“最佳”方法以及最终的含义。
我发现以下示例非常简单,可以满足我的要求:
function SomeFunctionComponent() {
const [fakeData, setFakeData] = useState(0);
const [trigger, setTrigger] = useState(false);
async function fetchData() {
if (!trigger) return;
const newData = await someAPI.fetch();
setTrigger(false);
setFakeData(newData);
}
useEffect(() => {
fetchData();
}, [trigger]);
return (
<React.Fragment>
<p>{fakeData}</p>
<button onClick={() => setTrigger(!trigger)}>Refresh</button>
</React.Fragment>
);
}
Run Code Online (Sandbox Code Playgroud)
function SomeFunctionComponent() {
const [fakeData, setFakeData] = useState(0);
async function fetchData() {
const newData = await someAPI.fetch();
setFakeData(newData);
}
return (
<React.Fragment>
<p>{fakeData}</p>
<button onClick={fetchData}>Refresh</button>
</React.Fragment>
); …Run Code Online (Sandbox Code Playgroud)