web-dev-qa-db-ja.com

IOptions <T>への単純化されたアプローチ

組み込みのDIメカニズムを使用しながら、ASP.NET Core2.1アプリケーションに合わせて.NETFrameworkクラスライブラリを取得しようとしています。ここで、構成クラスを作成し、appsettings.jsonに適切なセクションを追加しました。

services.Configure<MyConfig>(Configuration.GetSection("MyConfiguration"));
services.AddScoped<MyService>();

クラスlib:

public class MyService 
{
    private readonly MyConfig _config;

    public MyService(IOptions<MyConfig> config)
    {
        _config = config.Value;
    }
}

ただし、このclasslibをビルドするには、Microsoft.Extensions.OptionsNuGetパッケージを追加する必要があります。問題は、パッケージが1つのインターフェイスのためだけに追加するにはかなり過剰に見える、非常に多くの依存関係を持っていることです。

enter image description here

したがって、最終的に問題となるのは、「依存関係が大きくない.NET FrameworkクラスライブラリにあるDIサービスを構成するために実行できる別のアプローチはありますか?

8
mmix

FilipWojcieszynによって書かれたこの記事を確認してください。

https://www.strathweb.com/2016/09/strongly-typed-configuration-in-asp-net-core-without-ioptionst/

拡張メソッドを追加します。

public static class ServiceCollectionExtensions
{
    public static TConfig ConfigurePOCO<TConfig>(this IServiceCollection services, IConfiguration configuration) where TConfig : class, new()
    {
        if (services == null) throw new ArgumentNullException(nameof(services));
        if (configuration == null) throw new ArgumentNullException(nameof(configuration));

        var config = new TConfig();
        configuration.Bind(config);
        services.AddSingleton(config);
        return config;
    }
}

構成で適用します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.ConfigurePOCO<MySettings>(Configuration.GetSection("MySettings"));
}

そしてそれを使用します:

public class DummyService
{
    public DummyService(MySettings settings)
    {
        //do stuff
    }
}
5
Slawomir Brys

少し前にこの問題にぶつかりましたが、本当に問題と言えば。そのような依存関係リストを見ると、私たち全員が少しシェルショックを受ける傾向があると思います。しかし、@ Tsengが述べたように、非常に小さなアセンブリをたくさん含めることは実際には大したことではありません(別のプロジェクトでの参照により、とにかくbinに含まれる予定です)。しかし、オプションインターフェイスのためだけにそれらを含める必要があるのは面倒だと認めます。

私がそれを解決した方法は、startup.csのサービス依存関係を解決し、それに応じてサービスのコンストラクターを調整することでした。

services.AddTransient<MyService>(Configuration.GetConfiguration("MyConfiguration"));
1
pimbrouwers

IOptionsが提供するものを気にしない場合は、IConfigurationをサービスに注入してみませんか?

public class MyService
{
    private readonly IConfiguration _config;

    public MyService(IConfiguration config)
    {
        _config = config;
    }

    public void DoSomething()
    {
        var value = _config["SomeKey"];

        // doing something
    }
}
0
TheBlueSky