8

.NET サービス層へのインターフェイスがあり、Web サービスを介してサードパーティ システムと通信します。これは、サードパーティ システムの機能に関連する多くのさまざまなタスクを処理します (実際には特注の CRM システムですが、コンテキストは関係ないので、これを簡単なものに置き換えます)。

インターフェイスは次のようになります。

public interface IMyService
{
    CarModel GetCar(string registration);
    CarModel AddCar(Car car);
    PersonModel GetPerson(string personId);
    PersonModel AddPerson(Person person);
}

現在、私のモデルは次のように機能していBaseResponseModelますSomethingModel。それぞれにいくつかの基本的なプロパティが含まれ、次のようSomethingModelに - もラップされます。Something

基本応答モデル

public class BaseResponseModel
{
    public List<string> Errors { get; set; }
    public bool HasErrors
    {
        get
        {
            return (Errors != null && Errors.Count > 0);
        }
    }
}

特定の応答モデル

public class CarModel : BaseResponseModel
{
    public Car Car { get; set; }
}

public class PersonModel : BaseResponseModel
{
    public Person Person { get; set; }
}

ここではCarPerson単純に一連のパブリック プロパティが含まれています。次に、my の各メソッドはIMyService引数を受け取り、.asmx Web サービスへの要求をフォーマットし、応答を解析して応答モデルに変換し、それを呼び出し元に返します (.ascx 分離コード)。

ただし、さまざまな...Modelクラスの数 (ラップされたオブジェクトのプロパティ名がすべて異なることは言うまでもありません) は見苦しくなっていきます。私は次の方針に沿って何かをするつもりです:

public class Car
{
    public string Registration { get; set; }
}

public class ServiceResponse<T>
{
    public List<string> Errors { get; set; }
    public bool HasErrors { ... }
    public T Result { get; set; }
}

public interface IMyService
{
    ServiceResponse<Car> GetCar(string registration);
    ServiceResponse<Car> AddCar(Car car);
    ServiceResponse<Person> GetPerson(string id);
    ServiceResponse<Person> AddPerson(Person person);
}

私の ASP.NET コントロールは、ServiceResponse<T>のすべてのメソッドから受信しIMyServiceます。

これは、C# でのジェネリックの "従来どおりの" 使用法ですか? それとも、これは私のソリューションでより深いアーキテクチャの欠陥を隠しているだけですか? 私の提案したソリューションに欠けているものはありGetますAddか?

免責事項: この質問が「あまりにも主観的」である場合は申し訳ありませんが、Programmers.SE の理論的な質問であるには具体的すぎ、CodeReview.SE の質問であるには一般的すぎるようです。必要に応じて、質問を改善する方法についての提案をお待ちしています。

4

2 に答える 2

2

おそらく .NET 以外からサービスを使用する人がいない限り、このジェネリックの使用に問題はないと思います。WSDL の非常に醜いコントラクト名が生成されると思います。

したがって、あなたのユースケースでは、それで問題ないと思います。Modelあなたも からに変わってくれてうれしいですResponse。私はそれを提案するつもりでした。

エラーがどのように使用されるかに応じて、個人的には (集約された) 例外を発生させることを好みます。ただし、フォームの検証などに使用する場合は、それで問題ないと思います。

于 2013-03-28T20:01:01.823 に答える