c# - 按需单例。很想知道这是否是一种不好的做法,以及实现我的目标的更好方法
问题描述
在 ASP.Net Core 中制作页面时,我经常需要做一堆只需要在启动期间进行的工作,例如从磁盘加载一个 JSON 文件,该文件将包含一些数据,通常只需一个 RazorPage。
要实现这一点,通常执行以下操作:
启动.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
{
}
启动.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);
}
// ...
}
所以我想知道你们在这种情况下会做什么,是否有更好的方法来做到这一点。
脚注:我不是在制作一个可扩展的大型网站,所以我不太关心使用界面和可扩展性方面的最佳实践。
解决方案
概念没问题。我会改进措辞。
由于措辞重叠,我不会命名您的属性Singleton
。它没有说明它实际上做了什么,最坏的情况被误解为实现单例(反)模式。
为什么不给它命名,AutomaticallyAddedToServicesAsSingletonAttribute
这样你就可以像这样注释你的类:
[AutomaticallyAddedToServicesAsSingleton]
public class FoobarReferenceDataReader
{
//...
}
现在很清楚这是做什么的。
推荐阅读
- java - Hadoop:Datanodes没有启动
- reactjs - React Native 中用户定义的 SQLite 表和 SQL 注入
- visual-studio - VS 不会更改源文件位置
- python - 如何将命令输出存储在文件中
- django - 如何使用通用类视图在 Django 中过滤类别明智的产品
- algorithm - 从 n 个数字的数组中选择 P 个独立对,最小化对的绝对差之和
- javascript - 如何在 Firestore 中迁移文档?
- python - Parsing dates from OCRed files using dateparser library
- php - 如何通过localhost打开php文件?
- ios - 未加载库:@rpath/FBSDKCoreKit.framework/FBSDKCoreKit