2

人のフルネームを表示する必要がある3つのビューモデルがあります。

もちろん、3つのビューモデルすべてで関数を複製できますGetFullName()が、それほど乾燥していません。

しかし、その人物のフルネームを計算するロジックはどこに残せばよいのでしょうか?

  • 4 つのフィールドを持つインターフェイスを作成し (4 つのフィールドのフルネームを計算します)、3 つのビューモデルすべてにインターフェイスを実装し、インターフェイスを取得して文字列を返す「PersonH​​elper」クラスを作成しますか?
  • 独自のクラスを作成するにはロジックが少なすぎますか?
  • ロジックを含む 3 つのビューモデルの基本クラスを作成しますか? (しかし、API 関数で関数を使用したい場合はどうすればよいでしょうか?)
  • ヘルパーはおそらく PersonService と呼ばれますか? 昔は Person クラス自体に配置されていたロジックでしたが、現在はデータ クラスを動作から分離しています (おそらく 'PersonBehaviour'?)

とても単純なことであり、それを実装する方法はたくさんあります。

それについてどう思いますか?

4

4 に答える 4

2

私が最初に考えたのは、ビュー モデルがユーザー データを直接格納しているか、ユーザー名を含むクラスを公開しているかを尋ねることです。そうでない場合は、おそらくユーザー名データを独自のクラスにリファクタリングします (アプリにとって意味がある場合は、他のユーザー データと共に、FormattedFullName プロパティをそのクラスに配置します。

public class ViewModel1()
{
    public PersonData myPerson {get; set;}
    // other properties
}

public class ViewModel2()
{
    public PersonData myPerson {get; set;}
    // other properties
}

public class PersonData()
{
    public string forename { get; set; }
    public string surname { get; set; }
    public string FormattedFullName 
    { 
        get 
        { 
            return string.Format("{0} {1}", forename, surname); 
        } 
    }
    // other properties
}
于 2012-12-04T15:52:09.673 に答える
2

住所行を複数行または単一行で表示するなど、特定のデータの書式設定を処理する「フォーマッタ」クラスがあります。

次のように呼び出します:Formatter.FormatAddress(address)ここで、address は Model クラスのインスタンスです。このようなロジックは、フルネームで簡単に適用できます。


別のオプションは、独自の HtmlHelperExtensions を作成することですHtml.FormatFullName(Model.FirstName, Model.LastName)

public static IHtmlString FormatFullName(this HtmlHelper helper, params string[] names)
{
    return new MvcHtmlString(helper.Encode(string.Join(" ", names)));
}

HtmlHelperExtensions に html を追加することも悪い習慣とは見なされないので、それは素晴らしいことです。

于 2012-12-04T16:01:39.883 に答える
1

3つのビューモデルに、フルネームの計算に使用されるフィールドを備えた共通のインターフェイスIFormattablePersonを実装させ、String.Formatに依存させます。

これにより、カスタムフォーマッタに新しい文字列フォーマットを追加するだけで、表示を拡張する非常に便利な方法が可能になります。

これは次のようなものになります:

ビューモデルが実装する必要のある共通のインターフェイス:

public interface IFormattablePerson: IFormattable
{
string FirstName{get;set;}
string LastName{get;set;}
}   

各ビューモデルでの同じToString()実装(変更されることはありません)

public string ToString(string format, IFormatProvider formatProvider)
{
    if (formatProvider == null)
        return ToString(format, new FormatProviderIFormattablePerson());
    else
        return (formatProvider.GetFormat(typeof(IFormattablePerson)) as ICustomFormatter).Format(format, this, formatProvider);
}

これは、IFormattablePersonにFormatProviderとCustomFormatterを使用します。次に、CustomFormatterで新しいフォーマットを追加して実装する必要があります

public class FormatProviderIFormattablePerson : IFormatProvider
{
    // String.Format calls this method to get an instance of an
    // ICustomFormatter to handle the formatting.
    public object GetFormat(Type service)
    {
        if (service == typeof(IFormattablePerson))
        {
            return new CustomFormatterIFormattablePerson();
        }
        else
        {
            return null;
        }
    }
}

public class CustomFormatterIFormattablePerson : ICustomFormatter
{
    public string Format(string format, object arg, IFormatProvider provider)
    {
        if (string.IsNullOrEmpty(format))
            format = "full";

        if (arg is IFormattablePerson)
        {
            IFormattablePerson t = (IFormattablePerson) arg;
            switch (format)
            {
                case "f": 
                    return t.FirstName;

                case "l": 
                    return t.LastName;

                case "full": 
                default:
                    return string.Format("{0} {1}",
                        t.FirstName,
                        t.LastName).Trim();
            }                   
        }
        if (arg is IFormattable)
            return string.Format(String.Format("{{0:{0}}}",format), arg);
        else
            return arg.ToString();
    }
}
于 2012-12-04T16:17:21.633 に答える
1

3 つすべての ViewModel の BaseClass ではどうでしょうか。

public string FirstName {get;set;}
public string LastName {get;set;}
public string FullName {get{return String.Format("{0} {1}",FirstName,LastName);}}

基本クラスを使用すると、3 つの ViewModel すべてのコードの重複を最小限に抑えることができます。これはまた、(将来の開発者にとって) 理解しやすく、すぐに変更できるシンプルなソリューションです。この機能性を制限する API について何かありますか?

于 2012-12-04T15:51:46.133 に答える