1

サーバーとクライアントの 2 つのクラスがあります。サーバーは複数のスレッドでクライアントをインスタンス化する必要があり、クライアントにはカスタム実装を提供する必要がある仮想メンバーがあります。私の質問はです。Client クラスは Server クラスのネストされたクラスである必要がありますか、それともインターフェイスと依存性注入を使用してカスタム実装を Server クラスに取得する必要があります。現在、Client クラスには、変更してはならない標準ロジックを提供する多くのプライベート メソッドもあります。

public class Server
{
    public void DoWork()
    {
        for (var i = 0;i < 10; i++)
        {
            Client client = new Client();
            client.Process(i);
        }
    }
}

public class Client
{
    private void doSomething() 
    { 
       ...
    }

    // Needs to be overridden and provide custom logic
    public virtual string Process(int i)
    {
        return i.ToString();
    }
}

作業例:

public interface IClient
{
    string Process(string message);
}

public abstract class Client : IClient
{
    public virtual string Process(string message)
    {
        return message;
    }
}

public class CustomClient : Client
{
    public CustomClient() { }

    public override string Process(string message)
    {
        return string.Format("Custom Client:{0}", message);
    }
}

public class Server
{
    private Func<IClient> createClient;    

    public Server() { }

    public Server(Func<IClient> client)
    {
        createClient = client;
    }

    public void DoWork()
    {
        for (var i = 0; i < 10; i++)
        {
            IClient = client = createClient();
            client.Process(string.Format("Client #{0}", i));
        }
    }
}

テスト プログラム...ステップスルーして、それが CustomClient にヒットすることを確認します

class Program
{
    static void Main(string[] args)
    {
        Func<CustomClient> factory = () => new CustomClient();
        var server = new Server(factory);
        server.DoWork();
    }
}
4

2 に答える 2

1

サーバーがクライアントを作成する必要がある場合は、ファクトリ メソッドをサーバーに渡して使用します。だから私は依存性注入に行きます。

Server例:コンストラクターに aを渡し、Func<IClient>それをプライベート フィールドに割り当てることができcreateClientます。

Client client = new Client();

使用する

IClient client = createClient();

そうすれば、サーバーとクライアントを完全に切り離すことができます。

Func完全なファクトリ クラスよりも単純なデリゲートを使用することを好みます。これは、(a) 使いやすく、(b) より疎結合であるためです。

于 2013-04-06T18:07:27.460 に答える
1

依存関係を注入または修正する必要があるかどうかという質問には、簡単な答えがあります。変更の対象となるロジックを提供するクラスは、注入される候補です。一方、ロジックを変更する予定がない場合は、ほとんどの基底クラス ライブラリで行うように、固定型に対してコーディングします。

あなたが説明することは、DIのシナリオのように聞こえます-クライアントクラスをオーバーライドできる場合、変更が可能であると想定します。DI は、依存関係と変更を同時に処理する最も明白な方法の 1 つです。

于 2013-04-06T17:00:52.800 に答える