是否有更好的方法来实现可继承的方法,该方法返回继承该类类型的对象?

2024-05-07

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

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

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>成为可能。

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

基本上,我试图让实体框架代码优先的 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); 

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

但我们的想法是为 CRUD 操作提供一个通用的基础存储库接口:

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

以及特定实体的特定接口:

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 实体。本文 http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application显示了使用 EF 的存储库模式的示例(跳到“实现通用存储库和工作单元类”部分),尽管我更喜欢通过 DI 将存储库注入到控制器中,而不是通过newed 在控制器构造函数内。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有更好的方法来实现可继承的方法,该方法返回继承该类类型的对象? 的相关文章

随机推荐