【问题标题】:On Demand Singletons. Curious to know if this is a bad practise, and what a better way of achving my goal按需单例。很想知道这是否是一种不好的做法,以及实现我目标的更好方法
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多