gpt4 book ai didi

c# - 有没有更好的方法来实现一个可继承的方法,该方法返回一个继承自该类类型的对象?

转载 作者:行者123 更新时间:2023-11-30 16:58:44 24 4
gpt4 key购买 nike

我正在尝试创建一个基类,它指定一个返回的方法,比如它自己类型的列表。我希望此方法能够在继承类上正常工作,即。返回继承类的列表。

这是我能想到的唯一方法。

public abstract class Base<T>
where T : Base<T>
{
public List<T> getList()
{
return new List<T>();
}
}

public class Foo : Base<Foo>
{
}

var foo = new Foo();

// Should return List<Foo>
var fooList = foo.getList();

有没有更好的方法不需要Foo以自身为类型继承基数?说指定 List<this>或类似 Base

正如 Groo 指出的那样,理想情况下我不想要 class Bar : Base<Foo>成为可能。

我正在尝试解决更新的实际问题:

基本上,我试图让 Entity Framework 代码优先的 POCO 类返回它们自己的模型存储,这样我就可以编写代码来处理 POCO 类的验证,并为 API 保存。

模型存储封装了基本的 CRUD 操作,以便我们可以覆盖访问方法来执行其他操作,例如隐藏软删除的项目。

我在实现相同的 getModelStore 后决定这样做验证类和 DTO 代码中的方法(数据传输对象 - 在 WSDL API 和 POCO 之间转换)。

public abstract class EntityBase<T>
where T : EntityBase<T>
{
public abstract ModelStore<T> getModelStore(Repository repository);
}

public class Foo : EntityBase<Foo>
{
public override ModelStore<Foo> getModelStore(Repository repository);
{
// repository.Foo is a Foo ModelStore
return repository.Foo;
}
}

var repo = new Repository();
var foo = new Foo();

// Should return the ModelStore for Foo
var fooList = foo.getModelStore(repo);

最佳答案

我认为主要问题是这些方法不属于实际实体,而应该由您的存储库服务定位器提供(好吧,它根本不必是定位器,理想情况下您只需有一个组合根并通过构造函数注入(inject)所有 repo 依赖项)。

但我们的想法是为 crud 操作提供一个通用的基础 repo 接口(interface):

public interface IRepo<T>
{
T Get(long id);
IList<T> GetAll();
void Save(T instance);
...
}

以及特定实体的特定接口(interface):

public interface IFooRepo : IRepo<Foo>
{
// additional Foo-specific stuff, if needed
}

这允许您拥有一个通用的基础抽象实现:

public abstract class BaseRepo<T> : IRepo<T>
{
// provide default implementations for Load, Save and common stuff
}

然后您的特定存储库继承基类并可选地实现特定方法(请注意,不应在任何地方直接实例化此类,而应通过 DI 容器实例化):

class FooRepo : BaseRepo<Foo>, IFooRepo
{
// no need to re-implement anything except Foo-specific stuff
}

最后您有了服务定位器(免责声明:它通常用作单例,但实际上不应该这样):

// get the service locator
var repoFactory = GetRepoFactory();

// get the actual repo through DI
var repo = repoFactory.GetRepo<IFooRepo>();

// do stuff
var foo = repo.FindAll();

因此,我的主要评论是我最后一个代码片段中的 GetRepo 方法不属于 POCO 实体。 This article显示了使用 EF 的存储库模式示例(跳至“实现通用存储库和工作单元类”部分),尽管我更希望通过 DI 将存储库注入(inject) Controller ,而不是 new 在 Controller 构造函数中编辑。

关于c# - 有没有更好的方法来实现一个可继承的方法,该方法返回一个继承自该类类型的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24862020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com