我正在使用实体框架生成一个"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
}
有没有办法做到这一点,或者我应该采用现有的设计?
您可以将它们写成扩展方法:
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
我会在这里进行一些依赖注入。IDemorize定义了4个方法,其中2个方法在整个框架中具有通用实现。我要做的是:从IDemoriale中提取一个新接口,并向实现该接口的对象添加一个依赖项到CClass中。
public interface IDemoralizeBase
{
void Demoralize(Func<IDemoralize, bool> CustomDemoralization);
void WriteModel(Func<IDemoralize, bool> Write);
}
向CClass添加一个对象IDemolizeBase,并定义一个构造函数,用于注入依赖
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类来实现IDemolizeBase,这样,如果您在某些特殊情况下获得了一些特殊的实现,您就可以注入一个特殊的依赖项。
干杯,
Raphael