1

私は、アプリケーションの 1 つを将来的により柔軟でスケーラブルにするためにリファクタリングすることを期待して、Ninject を介した依存性注入に関する多くの読書とチュートリアルを行ってきました。私の Web アプリは、バックエンド インフラストラクチャへのアクセスを可能にする API の上に構築されています。

私が解決しようとしている技術的負債の一部は、私が行わなければならない API 呼び出しごとに繰り返されるコードです。API には、さまざまなエンティティを取得および管理するための約 45 ~ 50 のメソッドがあります。

次の (非常に簡略化された) コード例は、コードのいたるところに見られる繰り返しパターンを示しています。Ninject/DI は作業を簡単にするのに役立ちますか?

namespace MyApp
{
public class example
{
    public  static WebAccount Fetch_Account(Guid accountID)
    {
        //Create instance of API, request and response objects
        WebAPI api = new WebAPI();
        Fetch_Account_Request accountRequest = new Fetch_Account_Request();
        Fetch_Account_Response accountResponse = new Fetch_Account_Response();

        //Api call security signature
        ApiSecuritySignature signature = new ApiSecuritySignature(/*My API ID */, /*My API Key */);

        accountRequest.API_ID = /* My API ID */;
        accountRequest.Token = signature.Token;
        accountRequest.TimeStamp = signature.Date;

        //Id of the account to be fetched
        accountRequest.Account_ID = accountID;

        //Fetch the account
        accountResponse = api.Fetch_Account(accountRequest);

        return accountResponse.Account;
    }


    public static void Manage_Account(WebAccount account)
    {
        //Create instance of API, request and response objects
        WebAPI api = new WebAPI();
        Manage_Account_Request manageAccountRequest = new Manage_Account_Request();
        Manage_Account_Response manageAccountResponse = new Manage_Account_Response();


        //Api call security signature
        ApiSecuritySignature signature = new ApiSecuritySignature(/*My API ID */, /*My API Key */);

        manageAccountRequest.API_ID = /* My API ID */;
        manageAccountRequest.Token = signature.Token;
        manageAccountRequest.TimeStamp = signature.Date;

        //account to modify
        manageAccountRequest.Account_ID = account.Account_ID;

        //set Account properties
        manageAccountRequest.Email =  account.Email;
        manageAccountRequest.Address_1 =  account.Address_1;
        manageAccountRequest.City = account.Postal_Zip;
        manageAccountRequest.Postal_Zip = account.Postal_Zip;
        manageAccountRequest.Country = account.Country;
        manageAccountRequest.State = account.State;

        //Make the call
        manageAccountResponse = api.Manage_Account(manageAccountRequest);
    }
}
}

すべてのリクエスト オブジェクトとレスポンス オブジェクトのコードにアクセスできるわけではないことに注意してください。これらは、私が参照する共有ライブラリの一部です。

4

2 に答える 2

3

依存性注入自体は役に立ちません。クラス自体に依存関係を作成させるのではなく、依存関係が確実に提供されるようにするだけです。

IoC コンテナーは、オブジェクトをいつ作成して破棄するか、つまりオブジェクトの有効期間を処理するだけです。(依存性注入はあなたが得るボーナスです)

適切な解決策は、ファクトリ メソッド patternを使用することです。

次のようなインターフェイスを作成できます。

public interface IWebApiFactory
{
    Fetch_Account_Request CreateAccountRequest();
}

コードを次のように単純化できるようにします。

public  static WebAccount Fetch_Account(Guid accountID)
{
    var request = _factory.CreateAccountRequest();
    request.Account_ID = accountID;
    var response = api.Fetch_Account(accountRequest);
    return accountResponse.Account;
}

もちろん、IWebApiFactoryクラスをクラスに注入することもできますexample

補足: DI/IoC を使用している場合は、可能な限り静的クラスを避ける必要があります。

私の IoC 記事を読むことに興味があるかもしれません (IoC/DI をよりよく理解するため):

于 2012-09-10T07:37:42.610 に答える
2

はい、例の型のクラスを作成するためにファクトリを作成できます。その依存関係を 1 か所で宣言することにより、コンポジション ルート パターンを尊重するようにしてください。どうやら多くの Managerxxx クラスが必要です。それらを「example」クラスのコンストラクターパラメーターとして宣言するだけで、ninject は再帰的な依存関係を使用してそれらを作成します。

于 2012-09-09T15:39:12.013 に答える