2

あまり使い物にならないコール センター アプリケーション用に、単純な MVC3 ベースのチケット エントリ サイトを構築しました。プロトタイプをリファクタリングして、デザイン パターンによりよく準拠するようにしています。ユーザー向けビューは、さまざまなリソース タイプを選択できるいくつかのパネルに加えて、基本的なユーザー情報で構成されるフォームです。各リソース タイプ (ハードウェア、ソフトウェアなど) は同じ方法で表示されます。追加/削除ボタンを備えたデュアルのフィルター可能なリストボックス、要求されたリソースに正当性が必要な場合に条件付きで表示されるオプションの「正当性」テキスト領域、および一般的なコメントを使用します。個々のパネル用に次の ViewModel を作成しました。

public class RequestableList
{
    // list of requestable items ids requiring justification
    private List<string> _restrictedItems = new List<string>();
    public List<string> RestrictedItems
    {
        get { return _restrictedItems; }
        set { _restrictedItems = value; }
    }

    // the key-value pairs from which to populate available items list
    private Dictionary<string, string> _availableItems = new Dictionary<string, string>();
    public Dictionary<string, string> AvailableItems
    {
        get { return _availableItems; }
        set { _availableItems = value; }
    }

    // item ids requested by user
    private List<string> _requestedItems = new List<string>();
    public List<string> RequestedItems
    {
        get { return _requestedItems; }
        set { _requestedItems = value; }
    }
}

メインの ViewModel は、必要に応じて複数の RequestableList で構成されます。

public class SimpleRequestViewModel
{
    public UserInfo userInfo { get; set; }
    public RequestableList Software {get;set;}
    public RequestableList Hardware {get;set;}
    public RequestableList Access {get;set;}
    public string SoftwareAdditionalInfo { get; set; }
    public string HardwareAdditionalInfo { get; set; }
    public string AccessFileMailShare { get; set; }
    public string AccessAdditionalInfo { get; set; }
    public string SoftwareJustification { get; set; }
    public string HardwareJustification { get; set; }
    public string AccessJustification { get; set; }
    public string Comment { get; set; }
}

SimpleRequestViewModel (およびそのバリアント) の厳密に型指定されたビューと、デュアル リストボックス、フィルタリング、および jquery を接続する RequestableList の厳密に型指定された EditorTemplate を作成しました。すべてが適切にレンダリングされ、機能していますが、コードは現在臭いがあります。

コントローラーに投稿するとき、モデルが有効であれば、コール センター アプリで新しいチケットを作成するために、モデルを読み取り可能なテキストの説明に変換する必要があります。コントローラーがその変換を実行して読み取り可能なテキストにするのは適切ではありませんが、ビューモデルを変換する別のクラスを設計しようとすると、ハードルに遭遇します。

  1. 選択されたアイテムの値のみが投稿されるため、リクエストをテキストに変換する前に、まず提供された値に適したテキストを検索する必要があります (説明には値が必要です)。コントローラは、現在、このルックアップ クエリのコール センター データ モデルにアクセスできる唯一のオブジェクトです。
  2. RequestableList のさまざまな組み合わせを含む 2 つの同様の ViewModel があるため、翻訳者はさまざまな組み合わせを翻訳できなければなりません。1 つにはハードウェアとソフトウェアのみがあり、もう 1 つにはハードウェア ソフトウェアとさらにいくつかの RequestableList があります。

ViewModel で直接 ToString() をオーバーライドすることを検討しましたが、そのビジネス ロジック (条件付きレンダリング) が気に入らなかったため、再度投稿すると、ViewModel にはリストボックスで選択された項目のテキストが含まれていないため、アクセスが必要になります。データモデルに。送信された値をテキストに変換するのは、現在コントローラーで処理されているため、switch ステートメントで処理されているため臭いがします。コントローラーは、ポストされた各 RequestableList を受け取り、新しいチケットの説明を作成する前に、元の「利用可能」フィールドに入力します。

switch (requestCategory)
{
    case RequestableCategory.Software:
        itemList = sde.GetSoftware();
        break;
    case RequestableCategory.Hardware:
        itemList = sde.GetHardware();
        break;
    case RequestableCategory.Access:
        itemList = sde.GetAccess();
        break;
    case RequestableCategory.Telecom:
        itemList = sde.GetTelecom();
        break;
    default:
        throw new ArgumentException();
}

だから、私の質問:

  1. 投稿されたビューモデルからチケットの説明への変換を実行するために、どのようなパターンの手法をお勧めしますか?
  2. 値だけでなくテキストも必要な場合、選択ボックスで「値のみを投稿する」問題を通常どのように処理しますか?
  3. この問題に取り組むためのより良い方法はありますか?

繰り返しになりますが、これが私にとって学習経験になることを願っており、必要に応じて追加情報や説明を提供したいと思っています.

4

1 に答える 1

1

いくつかの提案:

  1. コール センターへの送信を行うロジックを独自のクラスに抽象化します。コール センター DB にアクセスするために必要な依存関係を (コントローラーから) 提供します。オーバーロードを使用して、さまざまな種類のビュー モデルを処理するさまざまな方法があります。おそらく説明は DB から取得されるため、このクラスの値に基づいて DB から説明を抽出できます。このクラスは、表示アクション用のビュー モデルの構築も担当します。このパターンを使用すると、クラスはリポジトリを介して、または Web サービス/API を介して DB と直接対話できることに注意してください。

  2. 2 回目に DB から説明を検索する際にパフォーマンスが問題になる場合は、キャッシュを実装するリポジトリ パターンを使用します。コール センターが非常に大規模でない限り、そうはならないと思いますが、それはクエリ ロジックを最適化する場所です。リポジトリは、コントローラーが送信クラスに渡すものにすることができます。

  3. コントローラーで DB に直接アクセスする必要がない場合は、ブローカー クラスを依存関係として直接渡すことを検討してください。

次のようになります。

private ICallCenterBroker CallCenterBroker { get; set; }

public RequestController( ICallCenterBroker broker )
{
   this.CallCenterBroker = broker;
   // if not using DI, instantiate a new one
   // this.CallCenterBroker = broker ?? new CallCenterBroker( new CallCenterRepository() );
}

[HttpGet]
public ActionResult CreateSimple()
{
    var model = this.CallCenterBroker.CreateSimpleModel( this.User.Identity.Name );
    return View( model );
}


[HttpPost]
public ActionResult CreateSimple( SimpleRequestViewModel request )
{
    if (Model.IsValid)
    {
       var ticket = this.CallCenterBroker.CreateTicket( request );
       // do something with ticket, perhaps create a different model for display?
       this.CallCenterBroker.SubmitTicket( ticket );
       return RedirectToAction( "index" ); // list all requests?
    }
    return View();
}
于 2011-05-08T15:19:54.677 に答える