【发布时间】:2019-01-07 12:19:15
【问题描述】:
在 ASP.Net Core 中制作页面时,我经常需要做一些只需要在启动期间进行的工作,例如从磁盘加载一个 JSON 文件,该文件将包含一些数据,通常只需一个剃刀页面。
要实现这一点,通常执行以下操作:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSingleton(typeof(SingletonThatLoadsStaticDataFromAJSONFile));
// ...
}
SingletonThatLoadsStaticDataFromAJSONFile.cs
public class SingletonThatLoadsStaticDataFromAJSONFile
{
public SomeData SomeData;
public SingletonThatLoadsStaticDataFromAJSONFile(IHostingEnvironment env)
{
var path = Path.Combine(env.ContentRootPath, "PathToJSONFile");
this.SomeData = Deserialize(path);
}
}
为了让我的生活更轻松一些,我创建了一个属性,这样我就可以更轻松地做到这一点。这样我就不需要不断地添加 do services.AddSingleton(typeof(x)),而且我可以毫不费力地删除我的 RazorPages 文件夹而不会出现编译器错误。
SingletonAttribute.cs
public class SingletonAttribute : Attribute
{
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// ...
var singletonTypes = typeof(Program).Assembly
.GetTypes()
.Where(x => x.IsClass && x.GetCustomAttributes().OfType<SingletonAttribute>().Any());
foreach (var type in singletonTypes)
{
services.AddSingleton(type);
}
// ...
}
所以我想知道你们在这种情况下会做什么,是否有更好的方法来做到这一点。
脚注:我不是在制作一个可扩展的大型网站,因此我不太关心使用界面和可扩展性方面的最佳实践。
【问题讨论】:
-
我以前用过类似的方法。没关系。
-
这与您的问题没有直接关系......但我最近使用Scrutor 来清理我的程序集扫描服务代码。
标签: c# asp.net asp.net-core razor-pages