C#抽象方法强制更新方法

C#抽象方法强制更新方法,c#,generics,domain-driven-design,abstract-class,C#,Generics,Domain Driven Design,Abstract Class,在我们的代码库中,我们有一个基本模型(PersistenceEntity),它处理通过通用存储库持久化到存储的任何模型。这适用于获取、添加和删除。我想改进的地方是将更新方法封装在存储库中,而不是在服务层中获取对象,操作它(以开发人员认为合适的任何方式)然后保存它 存储库更新方法应该在内部加载模型,调用对象上的更新方法,然后保存它(或者调用AddOrUpdate扩展) 为此,我想我可以在基类上添加一个抽象方法,强制开发人员在模型中实现更新,而不是在另一层中设置属性 public abstract

在我们的代码库中,我们有一个基本模型(
PersistenceEntity
),它处理通过通用存储库持久化到存储的任何模型。这适用于获取、添加和删除。我想改进的地方是将更新方法封装在存储库中,而不是在服务层中获取对象,操作它(以开发人员认为合适的任何方式)然后保存它

存储库更新方法应该在内部加载模型,调用对象上的更新方法,然后保存它(或者调用AddOrUpdate扩展)

为此,我想我可以在基类上添加一个抽象方法,强制开发人员在模型中实现更新,而不是在另一层中设置属性

public abstract T Update<T>(T existing) where T : PersistenceEntity;
public abstract T Update(T existing),其中T:PersistenceEntity;
因此,这将使开发人员编写一个如下所示的模型:

public class MyClass : PersistenceEntity 
{
        public override MyClass Update<MyClass>(MyClass existing)
        {
            existing.SomeProperty = SomeProperty;
            existing.SomeProperty2 = SomeProperty2;
            return existing;
        }
}
公共类MyClass:PersistenceEntity
{
公共覆盖MyClass更新(MyClass现有)
{
existing.SomeProperty=SomeProperty;
existing.SomeProperty2=SomeProperty2;
返回现有的;
}
}

但当我以这种方式实现它时,编译器会抱怨,因为它认为
MyClass
是T的名称,而不是具体的类。我想我错过了一些明显的东西,但我就是看不到。。。任何建议都将不胜感激。

您可以通过使
PersistenceEntity
类本身泛型化来避免按类型隐藏类参数

公共抽象类PersistenceEntity,其中T:PersistenceEntity
{
公共摘要更新(现有);
}
它意味着自引用泛型约束,因为继承PersistenceEntity的每个类都应该更新自身类型的现有实例

MyClass
的实现如下:

公共类MyClass:PersistenceEntity
{
公共覆盖MyClass更新(MyClass现有)
{
existing.SomeProperty=SomeProperty;
existing.SomeProperty2=SomeProperty2;
返回现有的;
}
}
另一个选项是创建一个不变的接口,该接口包含
Update
方法(如果不允许将
PersistenceEntity
类设置为泛型)

公共接口i更新,其中T:PersistenceEntity
{
T更新(T现有);
}
然后实施它

公共类MyClass:PersistenceEntity,IUUpdate
{
公共MyClass更新(MyClass现有)
{
existing.SomeProperty=SomeProperty;
existing.SomeProperty2=SomeProperty2;
返回现有的;
}
}

是什么让你认为拥有一个泛型的
update
方法总比拥有setter好呢?谢谢,我们能够使persistenceEntity泛型化(经过一点重构),所以这很有效,谢谢!