1

以下のように、エンティティ フレームワークを使用して「CClass」エンティティを生成しています。

public partial class CClass: EntityObject
{
    #region Factory Method

    #region Primitive Properties
}

私の残りの部分クラスの実装は

public partial class CClass : IDemoralize
{
    public Value xValue { get; set; }

    public void IDemoralize.Demoralize()
    {
        // implementation

    }
    public void IDemoralize.Demoralize(Func<IDemoralize, bool> CustomDemoralization)
    {
        bool success = CustomDemoralization(this);

        if (!success)
            throw new ApplicationException();
    }

    public void IDemoralize.WriteModel()
    {
        // implementation
    }

    public void IDemoralize.WriteModel(Func<IDemoralize, bool> Write)
    {
        bool success = Write(this);
        if (!success)
            throw new ApplicationException();
    }
}

以下にリストされている 2 つのメソッドは、設計全体で共通の実装を持っているため、それらを DemoralizeBase と呼ばれる基本クラスに移動したいと考えています。これにより、コードの変更が必要になった場合でも、一貫性が管理しやすくなります。

// in DemoralizeBase 
public void Demoralize(Func<IDemoralize, bool> CustomDemoralization)
{
    //implementation
}

public void WriteModel(Func<IDemoralize, bool> Write)
{
    // implementation
}

これを行う方法はありますか、それとも既存のデザインを使用する必要がありますか?

4

2 に答える 2

3

それらを拡張メソッドとして書くことができます:

public static class Demoralize {
    public static void Demoralize(this IDemoralize obj,
         Func<IDemoralize, bool> CustomDemoralization) {...}
    public static void WriteModel(this IDemoralize obj,
         Func<IDemoralize, bool> Write) {...}
}

これは、インスタンスメソッドであるかのように機能します。

var foo = new CClass();
foo.Demoralize(...);

注意すべき点の1つは、現在のインスタンスで拡張メソッドを呼び出す場合、 this.(通常はオプションです)が必要です

Demoralize(...); // does not work
this.Demoralize(...); // works
于 2012-07-26T07:11:55.820 に答える
1

ここで依存性注入を行います。IDemoralize は 4 つのメソッドを定義します。そのうちの 2 つは、フレームワーク全体で共通の実装を持っています。私なら、IDemoralize から新しいインターフェイスを抽出し、そのインターフェイスを CClass に実装するオブジェクトに依存関係を追加します。

public interface IDemoralizeBase
{
    void Demoralize(Func<IDemoralize, bool> CustomDemoralization);
    void WriteModel(Func<IDemoralize, bool> Write);
}

オブジェクト IDemoralizeBase を CClass に追加し、依存関係を注入できるコンストラクターを定義します。

public class CClass : IDemoralize
{
    public IDemoralizeBase MyDemoralizer {get; private set;}

    public CClass(IDemoralizeBase basicDemoralizer)
    {
        MyDemoralizer = basicDemoralizer;
    }

    public void Demoralize(Func<IDemoralize, bool> CustomDemoralization)
    {
        MyDemoralizer.Demoralize(CustomDemoralization);
    }

    public void WriteModel(Func<IDemoralize, bool> Write)
    {
        MyDemoralizer.WriteModel(Write);
    }
}

これにより、IDemoralizeBase を実装する 1 つまたはn 個のクラスを作成できるため、特別なケースで特別な実装を取得した場合に、特別な依存関係を注入できます。

乾杯、

ラファエル

于 2012-07-26T07:32:02.230 に答える