【问题标题】:Static Method on Domain/Model Object with Repository具有存储库的域/模型对象上的静态方法
【发布时间】:2012-05-09 13:26:21
【问题描述】:

每个实体都有单独的存储库类。现在我想在使用存储库实例的域对象上实现一些静态方法,但这种方法的缺点是,我必须在静态变量上保存存储库实例(这在 Web 应用程序上效果不佳)或者我必须创建每个静态方法的新实例。有没有更好的方法(即在具有存储库实例的域类上实现静态方法)?请分享您的想法。

基础仓库:

public abstract class AbstractRepository<TEntity> : IabstractRepository<TEntity>
    where TEntity : EntityObject
{
    protected CivilRegistryEntities civilContext;

    public AbstractRepository()
    {
        civilContext = CivilRegistryEntities.Instance; // Per HTTP request singletone.
    }

    // Other method implementation goes here.
}

每个实体存储库:

public class BirthReportRepository : AbstractRepository<BirthReport>
{

}

域/实体/模型对象:

public partial class BirthReport
{
    //Not works well in web application.
    private static BirthReportRepository repository = new BirthReportRepository();

    public static BirthReport Method1()
    {
        return repository.SomeMethod();
    }

    public static BirthReport Method2()
    {
        return repository.SomeOtherMethod();
    }

    // Other methods(both static and instance) goes here.
}

【问题讨论】:

    标签: c# entity-framework design-patterns repository


    【解决方案1】:

    静态可变状态是可怕的。时期。存储库包含一个上下文,一个上下文包含大量可变状态。除此之外,上下文的生命周期应该很短。并且:我认为您的域 classes 应该与存储库无关。这是伪封装。相反,让域 services 处理 Method1、method2。

    您可以考虑使用 IoC 容器将上下文注入您的存储库,并将一个存储库注入您的域服务。 IoC 容器还可以处理上下文和存储库的生命周期。对于 Web,每个请求一个实例是常见的。

    【讨论】:

    • 存储库包含低级操作(LINQ to SQL),基础存储库(AbstractRepository)实现基本的 CRUD 操作。我认为直接在域类上处理所有方法将只是重复代码!好吧,IoC 可能是个不错的选择。
    • 只是代码的重复 不太明白你的意思,是好是坏?无论如何,您可以在任何地方使用静态方法。如果您想使用静态方法(这可能是完全合理的),我更愿意将它们放在一个显然是实用程序(或服务)类的静态类中。但除此之外,我认为让你的上下文保持短暂是一种很好的做法。还保持静态方法无状态。
    • 插入、按主键更新选择、全选、刷新是我不想在每个域对象上重复的常用方法。因此,我创建了基础存储库来执行这些任务,并创建了派生存储库来执行任何其他低级任务。这些不是静态的。
    • 让你的上下文保持短暂是一种很好的做法。这就是我想要做的......但仍然有一个静态方法会更好;专门用于查找器方法。例如:BirthReport.FindById(1) 或 BirthReport.FindAll()。这些是退出有意义的方法,但问题是这里的存储库。除了finder,其他都是实例方法。我觉得有这些方法的实例并不好。
    • 抱歉打扰了。我对这些东西很陌生。我想以最好的方式编写我的代码。感谢您的时间和耐心。
    猜你喜欢
    • 2012-06-02
    • 2016-12-14
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2012-06-10
    相关资源
    最近更新 更多