0

私の dll のいくつかのクラスは、一連のデータ (一般的な構成) を必要とします。これらのデータは、インターフェイス IConfigs の実装を通じてdll を使用する人によって提供されます。したがって、データは依存関係として注入する必要があります。今、私はそれをどうやって行うのだろうか.

アップデート :

申し訳ありませんが、質問が明確でない場合。問題は、それを必要とする各クラスに IConfigsのインスタンスが必要であり、コンストラクター注入を使用する必要があることです (このアプローチは好きではありません)、またはこの状況を処理するためのよりクリーンな方法がありますか?

4

3 に答える 3

1

ServiceLocatorヘルパークラスは静的であるため、スタイルを使用し、ヘルパークラスに挿入された値自体を取得させない限り、DIを使用することはできません。次のようになります。

public static class HelperClass
{
    static HelperClass()
    {
        var config = ServiceLocator.Get<IConfig>();
        UserId = config.Get("UserId");
    }

    public static int UserId { get; private set; }
}

ヘルパークラスは、を含むServiceLocatorで設定されていることに隠れた依存関係があるため、これは良い習慣とは見なされません。IConfigUserId

したがって、ヘルパークラスを非静的に変更し、次のように、IConfig必要なものをコンストラクターを介して注入することをお勧めします。

public class HelperClass
{
    public HelperClass(IConfig config)
    {
        UserId = config.Get("UserId");
    }

    public int UserId { get; private set; }
}

次に、次のように、コンストラクターHelperClassを介してサービスクラスにを挿入できます。

public class ServiceClass
{
    private readonly HelperClass _helperClass;

    public ServiceClass(HelperClass helperClass)
    {
        _helperClass = helperClass;
    }
}

このようにして、必要に応じて各コンポーネントを交換、スタブ、またはモックすることができます。HelperClass独自の状態がない場合は、シングルトンライフタイムで管理するようにDIコンテナーを構成できます。これにより、基本的に「静的」になり、欠点はありません。

于 2012-09-26T11:40:21.930 に答える
1

私があなたを正しく理解しているなら、1つのインターフェースで異なる派生クラスを登録したいのですが、使用するIoCコンテナーがわかりませんが、ここではサンプルコードのようにUnityを使用していますが、他のほとんどのIoCコンテナーは1つの文字列を使用して区別することをサポートしています1つのインターフェースでの登録。あなたが持っていると仮定します:

public interface IConfig {}
public class ConfigA : IConfig {}
public class ConfigB : IConfig {}

ConfigAしたがって、とConfigBIConfigの両方を別の名前で登録できます。

var container = new UnityContainer();

container.RegisterType<IConfig, ConfigA>("A");
container.RegisterType<IConfig, ConfigA>("B");


public class MainClass
{
    private IConfig _config;

    public MainClass([Dependency("A")] IConfig config)
    {
        _config = config;
    }
}

コンストラクターの依存関係を使用したくない場合は、プロパティを使用します。

public class MainA
{
    [Dependency("A")]
    private IConfig Config { get; set; }
}
于 2012-09-26T10:27:49.133 に答える
1

プロパティによる注入依存関係を使用できます。

MEF を使用する場合:

サービス

[Export(typeof(IServiec))]
public class Service : IService
{
 ....

}

クライアント

public  class Client  
{
    [Import]
    public IService Service
    {

    }
}

注: カタログとコンテナを登録するには、行を追加します

于 2012-09-26T09:22:13.540 に答える