C# 抽象方法强制执行更新方法
C# Abstract Method to enforce update method
在我们的代码库中,我们有一个基本模型 (PersistenceEntity
),它处理通过通用存储库持久存储的任何模型。这适用于获取、添加和删除。我想改进的地方是我们的更新方法被封装在存储库中,而不是在服务层中获取对象,操纵它(以开发人员认为合适的任何方式)然后保存它。
存储库更新方法应该在内部加载模型,调用对象的更新方法然后保存它(或调用 AddOrUpdate 扩展)。
为此,我想我可以在基础上添加一个抽象方法class来强制开发人员在模型中实现更新,而不是在另一层设置属性。
public abstract T Update<T>(T existing) where T : PersistenceEntity;
所以这会让开发人员编写一个像这样的模型:
public class MyClass : PersistenceEntity
{
public override MyClass Update<MyClass>(MyClass existing)
{
existing.SomeProperty = SomeProperty;
existing.SomeProperty2 = SomeProperty2;
return existing;
}
}
但是当我以这种方式实现它时,编译器会抱怨,因为它认为 MyClass
是 T 的名称而不是具体的 class。我想我在这里遗漏了一些明显的东西,但我看不到它...任何建议将不胜感激。
您可以通过使 PersistenceEntity
class 本身成为泛型来避免按类型参数隐藏 class
public abstract class PersistenceEntity<T> where T : PersistenceEntity<T>
{
public abstract T Update(T existing);
}
这意味着自引用泛型约束,因为每个 class 继承 PersistenceEntity
都应该更新其自身类型的现有实例。
MyClass
的实现如下:
public class MyClass : PersistenceEntity<MyClass>
{
public override MyClass Update(MyClass existing)
{
existing.SomeProperty = SomeProperty;
existing.SomeProperty2 = SomeProperty2;
return existing;
}
}
另一种选择是创建一个不变的接口,它封装了 Update
方法(如果不允许使 PersistenceEntity
class 通用)
public interface IUpdate<T> where T : PersistenceEntity
{
T Update(T existing);
}
然后实施
public class MyClass : PersistenceEntity, IUpdate<MyClass>
{
public MyClass Update(MyClass existing)
{
existing.SomeProperty = SomeProperty;
existing.SomeProperty2 = SomeProperty2;
return existing;
}
}
在我们的代码库中,我们有一个基本模型 (PersistenceEntity
),它处理通过通用存储库持久存储的任何模型。这适用于获取、添加和删除。我想改进的地方是我们的更新方法被封装在存储库中,而不是在服务层中获取对象,操纵它(以开发人员认为合适的任何方式)然后保存它。
存储库更新方法应该在内部加载模型,调用对象的更新方法然后保存它(或调用 AddOrUpdate 扩展)。
为此,我想我可以在基础上添加一个抽象方法class来强制开发人员在模型中实现更新,而不是在另一层设置属性。
public abstract T Update<T>(T existing) where T : PersistenceEntity;
所以这会让开发人员编写一个像这样的模型:
public class MyClass : PersistenceEntity
{
public override MyClass Update<MyClass>(MyClass existing)
{
existing.SomeProperty = SomeProperty;
existing.SomeProperty2 = SomeProperty2;
return existing;
}
}
但是当我以这种方式实现它时,编译器会抱怨,因为它认为 MyClass
是 T 的名称而不是具体的 class。我想我在这里遗漏了一些明显的东西,但我看不到它...任何建议将不胜感激。
您可以通过使 PersistenceEntity
class 本身成为泛型来避免按类型参数隐藏 class
public abstract class PersistenceEntity<T> where T : PersistenceEntity<T>
{
public abstract T Update(T existing);
}
这意味着自引用泛型约束,因为每个 class 继承 PersistenceEntity
都应该更新其自身类型的现有实例。
MyClass
的实现如下:
public class MyClass : PersistenceEntity<MyClass>
{
public override MyClass Update(MyClass existing)
{
existing.SomeProperty = SomeProperty;
existing.SomeProperty2 = SomeProperty2;
return existing;
}
}
另一种选择是创建一个不变的接口,它封装了 Update
方法(如果不允许使 PersistenceEntity
class 通用)
public interface IUpdate<T> where T : PersistenceEntity
{
T Update(T existing);
}
然后实施
public class MyClass : PersistenceEntity, IUpdate<MyClass>
{
public MyClass Update(MyClass existing)
{
existing.SomeProperty = SomeProperty;
existing.SomeProperty2 = SomeProperty2;
return existing;
}
}