web-dev-qa-db-ja.com

サービスロケータと依存関係の注入?

HTTPリクエストとアプリケーションのカスタムドメインリクエストの間のアダプタとして機能するクラスがあります。したがって、すべてのHttpリクエスト要素:URI、ヘッダー、コンテンツは、カスタマイズされたドメインオブジェクト要素にマップされます。

コンテンツのシリアル化/非直列化を実行する別のクラスDataMapper。このクラスは、HttpRequestのコンテンツをエンコード/デコードするためにアダプターによって使用されます。

DataMapper

public abstract class DataMapper {

    /**
     * Factory method to create Data mapper types
     * @param mediaType: Type for which Datamapper is to be created
     * @return
     */
    public static DataMapper getMapper(String mediaType) {
        MediaType type = MediaType.findType(mediaType); 

        switch(type) {

        case JSON:
            return new JSONDataMapper();

        case XML:
            return new XMLDataMapper();

        }
        throw new IllegalArgumentException("Invalid media Type: " + mediaType );

    }

    /**
     * Serialize general obj to XML
     * 
     */
    public abstract String serialize(Object ob);

    /**
     * Deserialize general obj to XML
     * 
     */
    public abstract Object deserialize(String obj);

}

アダプター

public class HttpToCustomDomainConverter {

    private DataMapper dataMapper;     

    /**
     * @param httpRequest: HTTP request
     * @param domainReq: Domain request 
     * @return nothing
     * @return Converts HTTP request to Domain Request
     */
    public void httpToCustomDomainRequest(HttpServletRequest httpRequest, CustomDomainRequest domainReq) {

        domainReq.setRequestIdentifier(httpRequest.getHeader("X-Domain-RI"));

        String acceptType = httpRequest.getHeader("Accept");
        String contentTypeHeader = httpRequest.getContentType();

        String serializedPayload = getPayload(httpRequest, contentType);

        dataMapper = DataMapper.getMapper(contentType);

        switch(httpMethod){

        case POST:
        case PUT:

            Object content = dataMapper.deserialize(serializedPayload));
            domainReq.setContent(content);

            break;

        case GET:
        case DELETE:
            break;
        }

        // ........
   }   
}

質問:

私のコードはSOLID=の原則にしたがいます。この中で心配しているのは、依存性注入です。

dataMapper = DataMapper.getMapper(contentType);
dataMapper.deserialize(serializedPayload));

ここでは、httpのrequestContentTypeヘッダーを取り出し、対応するDataMapper(XMLまたはJSON)を見つけて、コンテンツをシリアライズ/デシリアライズします。

そのため、DIに従うために、このクラスのコンストラクターでDataMapper(XmlDataMapperまたはJsonDataMapper)の特定の実装を渡します。

または、私のコードは、リクエストのcontentTypeに基づいて実行時にDataMapperを特定するのに適切です。

任意のアドバイスをいただければ幸いです。

1

あなたのライン、

私のコードはSOLID=の原則にしたがいます。この中で心配しているのは、依存性注入です。

混乱しています。依存性注入(DI)を使用していないことが心配ですか?もしそうなら、あなたはそれを検討するのは正しいと思いますが、心配するのは正しくないかもしれません。

テスト中にデータマッパーをモックできないため、DIを使用するのではなく、このサービスロケーターを使用すると、コードのテストが困難になる可能性があります。ただし、これらのマッパーに副作用がない場合は、それらをモックする必要がない場合があります。私のようなDI純粋主義者は、このロケーターにうんざりするかもしれませんが、実用的には、ここでの最良の選択かもしれません。

4
David Arno