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();
    }
}

现在,由于下面列出的两种方法在整个设计中确实有共同的实现,我想将它们移动到一个名为 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(...);

需要注意的一件事:在当前实例上调用扩展方法时,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);
    }
}

这将允许您创建一个或n个实现 IDemoralizeBase 的类,这样,如果您在某些特殊情况下获得一些特殊实现,您可以注入一个特殊的依赖项。

干杯,

拉斐尔

于 2012-07-26T07:32:02.230 回答