首页 > 解决方案 > 按需单例。很想知道这是否是一种不好的做法,以及实现我的目标的更好方法

问题描述

在 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);
    }
    // ...
}

所以我想知道你们在这种情况下会做什么,是否有更好的方法来做到这一点。

脚注:我不是在制作一个可扩展的大型网站,所以我不太关心使用界面和可扩展性方面的最佳实践。

标签: c#asp.netasp.net-corerazor-pages

解决方案


概念没问题。我会改进措辞。

由于措辞重叠,我不会命名您的属性Singleton。它没有说明它实际上做了什么,最坏的情况被误解为实现单例(反)模式。

为什么不给它命名,AutomaticallyAddedToServicesAsSingletonAttribute这样你就可以像这样注释你的类:

[AutomaticallyAddedToServicesAsSingleton]
public class FoobarReferenceDataReader
{
    //...
}

现在很清楚这是做什么的。


推荐阅读