3

現在、私はこれを持っています:

  • エンティティフレームワークによって生成されたモデル部分クラス
  • IDataErrorInfoインターフェイスを実装するこのエンティティの私自身の部分クラス

これは機能しますが、とにかくジェネリックコードを他のクラスに移動できますか?最善のアプローチは何ですか?私たちは(Entity Frameworkに移行する前に)「Entity」クラスとPocoを持っていました。このエンティティクラスは、IDataErrorInfoのようにインターフェイスが実装されている基本クラスから拡張されています。部分クラスの他の部分はすでにEntityObjectから拡張されているため、このアプローチを使用することはできませんが、すべての部分クラスを80%同じコードで再度記述するのは愚かです。唯一の「実際の」違いは、Validateメソッドのロジックです。

public partial class Customer : IDataErrorInfo, ICustomer
{
    private readonly IDictionary<string, string> _errors = new Dictionary<string, string>();

    public Customer()
    {
        base.
        PropertyChanged += Model_PropertyChanged;
    }

    private void Model_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        Validate();
    }

    private void Validate()
    {
        if (Name != null && Name.Equals("Banana"))
        {
            this[GetPropertyName(() => Name)] = "Some really nice error here";
        }
    }

    #region "IDataErrorInfo"

    public virtual string this[string columnName]
    {
        get
        {
            if (_errors.ContainsKey(columnName))
            {
                return _errors[columnName];
            }
            return null;
        }
        protected set
        {
            if (value == null && _errors.ContainsKey(columnName))
            {
                _errors.Remove(columnName);
            }
            else
            {
                if (_errors.ContainsKey(columnName))
                    _errors[columnName] = value;
                else
                    _errors.Add(columnName, value);
            }
        }
    }

    public virtual string Error
    {
        get
        {
            if (_errors.Values.Count > 0)
            {
                return _errors.Values.First();
            }
            return null;
        }
    }
    #endregion

    public static string GetPropertyName<T>(Expression<Func<T>> expression)
    {
        MemberExpression body = (MemberExpression)expression.Body;
        return body.Member.Name;
    }
}
4

1 に答える 1

1

IValidatableobject を使用できますhttp://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.ivalidatableobject.aspxを参照してください

于 2012-08-10T14:52:46.413 に答える