Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Winform-DAL和BLL-静态方法的使用是否良好?_C#_Methods_Static_Data Access Layer_Business Logic Layer - Fatal编程技术网

C#Winform-DAL和BLL-静态方法的使用是否良好?

C#Winform-DAL和BLL-静态方法的使用是否良好?,c#,methods,static,data-access-layer,business-logic-layer,C#,Methods,Static,Data Access Layer,Business Logic Layer,我遇到的疑问是关于在winform应用程序中实现DAL和BLL访问层期间使用静态方法的问题 我知道这里有很多关于这个话题的文章,但我没有找到任何能回答我具体问题的文章 简要介绍:我正在开发一个windows窗体应用程序,它将被许多用户使用(每个用户都在虚拟机上拥有自己的帐户-因此基本上应用程序的每个实例都将由不同的用户帐户执行)。 因为我不需要保留许多对象的状态,所以我决定使用(直到现在,我的意思是,对于某些操作)静态方法,特别是在DAL和BLL中,来执行诸如GetUserProfiles、Ge

我遇到的疑问是关于在winform应用程序中实现DAL和BLL访问层期间使用静态方法的问题

我知道这里有很多关于这个话题的文章,但我没有找到任何能回答我具体问题的文章

简要介绍:我正在开发一个windows窗体应用程序,它将被许多用户使用(每个用户都在虚拟机上拥有自己的帐户-因此基本上应用程序的每个实例都将由不同的用户帐户执行)。 因为我不需要保留许多对象的状态,所以我决定使用(直到现在,我的意思是,对于某些操作)静态方法,特别是在DAL和BLL中,来执行诸如GetUserProfiles、GetProfileByUserName、AddNewUser、UpdateUserBySerid等操作。。。或者使用一些信息(如:当前运行应用程序的用户、数据库中的查找数据等)保持应用程序的状态,这些信息在整个应用程序执行过程中保持不变

我的问题/疑问:使用静态方法实现对数据库的访问的这些部分是否正确,因为只需要检索信息,并且在我看来,不需要状态,因为每次执行它们时都像是新的执行,并且不需要以前的状态

在你看来,这是我正确的思维方式和方法,还是我做错了我目前看不到的事情


谢谢大家,每个人都会回复我,并给我一个关于做什么更好的建议。

尽管这个问题的答案完全取决于应用程序的大小/安全性/性能/时间。。。但对于大多数专业开发人员来说,这被称为“最佳实践”很重要

有些人可能会说(保持简单和愚蠢),但是如果你要考虑未来,你应该遵循最不熟悉的DAL最佳实践来设计。

假设下一年你的老板命令你在代码中使用实体框架,你会怎么做?如果您的代码只是一个成熟的代码,那么将所有内容更改为EF将需要大量的工作负载。或者,如果更改数据库引擎Oracle/MySql/SqlServer,会发生什么情况?如果你有很多代码,那么你就会陷入困境

我建议,如果您不打算处理复杂的模式,那么至少使用一个与DAL结合使用的接口

另一件需要提及的事情是,使用静态类使每个用户的DAL单线程对Win Form应用程序不是很好

因此,如果您希望应用程序具有灵活性和多线程能力,请选择它;这不是最佳实践,但如果您只是想让应用程序在那里工作,那么您就有了。

静态成员(方法、属性等)无法从面向对象(即多态性、继承、接口实现等)中获益

如果您使用的是存储库模式,那么您可以概括事物,并保持向特定存储库添加特定方法的能力。存储库可以描述为:

public interface IRepository<T>
{
    T GetById(int id);
    List<T> GetAll();
    void Create(T entity);
    void Delete(T entity);
    void Update(T entity);
}
公共接口IRepository
{
T GetById(int-id);
List GetAll();
无效创建(T实体);
无效删除(T实体);
无效更新(T实体);
}
这只是一个你可以根据自己的需要量身定做的例子

作为灵活性的一个示例,设想一个CSV导出器接受一个具有方法的存储库

public void Export<T>(string file, IReporistory<T> repository)
{
    ...
    List<T> result = repository.GetAll();
    ...
}
public void导出(字符串文件,iReportory存储库)
{
...
List result=repository.GetAll();
...
}
在实现此接口的
UserProfileRepository
中,您仍然可以添加接口中未定义的方法
GetProfileByUserName


如果您希望它更静态,可以将接口实现为。

我不遵循您关于线程的陈述。运行(多线程)任务需要委托,委托可以由静态方法或实例方法组成。每个用户都将启动winforms应用程序作为自己的进程。不过,我同意其他观点。@simone StackOverFlow不适合聊天,如果您想讨论,请使用,谢谢您的回复。我认为,这个应用程序,因为它是针对一个非常小的公司,将不会成长在未来。基本上它应该保持原样。关于你关于DAL的一句话,你能解释一下原因吗,因为应用程序将由不同帐户的不同用户在不同的环境中执行?现在,我正在访问SQL Server数据库并使用存储过程。根据这些新信息,您是否发现使用静态方法时存在任何安全漏洞,或者您是否发现不同用户使用此应用程序时存在任何问题?换句话说:您是否建议严格更改我的代码,并将实例方法中的所有内容转换为静态方法?@Simone我认为这一经验非常宝贵,若有,;it’这是一个小应用程序,你可以像你说的那样编写它。实现安全评估实际上还需要其他东西,比如身份验证和使用服务,所以请按照您的方式进行。只要看看他们的代码,看看他们是如何编码的,检查他们的代码,看看他们是如何评估这些问题的。答案非常明确,我对存储库设计模式很感兴趣,你描述的方式非常简单,如果你知道任何好的人会使用你在这里描述的模式,你能在评论中提供教程链接吗“repository pattern”(存储库模式)从非常基本的实现到非常复杂的实现,你会找到无数的答案。有些是硬编码的,有些则是非常复杂的。它们在使用的技术上也不同(如ADO.NET、EF等)。因此很难推荐一种而不是另一种。通用存储库被认为是一种反模式: