使用和公共对象之间的最佳方法是什么?

6

我想知道在使用语句和创建公共变量之间,哪种方法是最好的。

我的例子如下:

我有一个继承自可处理对象(disposable)的管理器类,这个类可以访问我的数据库上下文及其方法。

现在我正在我的cs类中使用这个类并根据需要创建和销毁对象。

例如:

public class StudentManager:  IDisposable
{
    private ISchoolUnitOfWork _unitOfWork;

    public StudentManager()
    {
        _unitOfWork = new SchoolUnitOfWork();
    }

    public IEnumerable<Student> GetStudents()
}

在我的计算机科学课程中,我学习:

private IEnumerable<Stundets> GetStudents()
{
    using (StudentManager manager = new StudentManager())
    {
         return = manager.GetStudents();
    }
}

或者

private StudentManager = new Studentmanager();

什么是最好的方法:使用我的StudentManager实例(仅创建连接,并在离开页面时销毁)还是使用"using"?
我有点困惑。提前谢谢!
我会通过调用上下文中的save方法来更新上下文,该上下文是我的工作单元接口,我不会直接访问上下文,而是在构造它时构造一个我的工作单元类型。
我在管理器上进行crud操作时保存。所以,在我的管理器上进行更新、插入和修改时,我调用保存方法,例如:
public class StudentManager....

        public Student UpdateStudent(Student student)
        {
            IStudentService service = new StudentService(_unitOfWork.StudentRepository);
            Student student= service.Update(student);
            _unitOfWork.Save();
            return student;
        }

通常情况下,我有一个名为IUnitOfWork的接口和一个叫做UnitOfWork的实现类,还有一个IRepository接口和一个repository实现类。我使用一个manager来代替直接实例化我的UnitOfWork,这样做既合法又有用!


4
请注意,您的业务类不应拥有存储库,也不需要使用IDisposable。但这只是将您与连接的问题转移。 - H H
在我看来,将上下文保存在私有字段中并在构造它的类的Dispose()方法中处理它是没有问题的。使用块是一种快捷方式,可以确保在完成后处理可处置对象的try/catch/finally模式 - 但这只是确保对象及时处理的一种模式。这个快捷方式的存在并不自动使所有其他模式无法使用。 - Keith Payne
2个回答

1
最好的方法是使用using语句,因为它会自动调用Dispose。您可以保证您的处理逻辑将发生。实际上,您应该像使用SqlConnectionSqlCommand这样的对象一样使用它们。所以你在使用using是正确的。
实际上,您提到正在使用DbContext访问数据。这些应该根据需要进行实例化,并且也应该用using进行包装。没有必要共享这些类型类的实例,因为连接池是通过连接字符串在SQL服务器上完成的。

@HenkHolterman,就像您每次想使用它时都会创建一个新的SqlConnection一样。 - Mike Perrenoud
不,它们不一样。连接是被池化的。而上下文会在每次失去其更改跟踪缓存。 - H H
@SimonBelanger,当你说它不会有任何有用的作用时,这意味着什么? - Mike Perrenoud
我可以保存它,因为在我的crud操作中,我会执行保存。例如: - user2528557
@MichaelPerrenoud DbContext 很有用,因为它本身就像一个 UnitOfWork 模式。它的使用方式是在一个“上下文”中使用,正如其名称所示。视图是一个上下文,用户控件(例如 WPF 中的)也是一个上下文,等等。在用户控件中,您应该在 UserControl 生命周期中保持 DbContext 的活动状态,并在同一时间处置它。如果正确使用,它非常有用。但绝对不应静态地跨线程使用。 - Simon Belanger
显示剩余7条评论

0

如果你使用 "using",那么可能需要在单个文件中多次编写类似的内容。例如:

//To get all students
private IEnumerable<Stundets> GetStudents()
{
using (StudentManager manager = new StudentManager())
{
    return = manager.GetStudents();
}
}

//To save Students
//To get all students
private IEnumerable<Stundets> SaveStudents()
{
using (StudentManager manager = new StudentManager())
{
    return = manager.Save();
}
}

等等。但在这里,您不必担心对象的处理。它将被自动处理。如果您选择全局声明,则需要手动执行此操作。因此,我需要说的是,如果您必须在整个页面上使用StudentManager,为什么不使其成为全局并在所有所需位置上使用两者?就像这样

private StudentManager manager;

//To get all students
private IEnumerable<Stundets> GetStudents()
{
using (manager = new StudentManager())
{
    return = manager.GetStudents();
}
}

//To save Students
//To get all students
private IEnumerable<Stundets> SaveStudents()
{
using (manager = new StudentManager())
{
    return = manager.Save();
}
}

如果我这样做,当我使用它时它会自动关闭,对吗?我只需使用管理器来不加载cs类,只在需要时调用我的dbcontext... - user2528557

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接