我正在使用ASP.NET MVC 5重写经典的asp web应用程序。
目前,在我的新应用程序中需要复制的包含文件中有许多常用代码。
我做了很多研究,并相信静态方法是可行的方法。
我打算对只使用本地数据或输入参数(除了对象)的实用程序使用静态方法
我计划对需要实例化其他对象等的实用程序使用实例方法。
我的问题是:
将IIS设置为InProc,静态方法是自包含的,还是可能被其他用户无意中交叉引用?
此应用程序将安装在单个服务器上,没有Web场或服务器集合等。
我也看过提到的扩展方法,但微软建议谨慎使用这些方法。最终,是否有更好的方法来替换静态方法以外的包含文件中的公共代码?
感谢阅读。
答案 0 :(得分:2)
暂且不谈架构辩论(在经典的ASP中,实用程序中的数据访问的一小部分是常见的 - 我认为你不想复制那个MVC,更好的是设计一些漂亮的层并抽象出所有数据处理你的模型)。
要回答您的主要问题,只要您不访问全局变量,静态方法就是自包含的。即
public static string somestring = "xyz";
public static void DoSomething()
{
somestring = "something else";
}
真的很糟糕,在多用户环境中分崩离析。
要回答你的最后一个问题,请参阅我的第一段。最好的方法是将模型(数据访问全部)开发到域模型中,数据访问层是其中的一个重要组成部分。至少重构数据访问方法到某种形式的DataAccess层,封装在一组接口后面 - 即使你现在没有时间/资源以更好的方式重写数据访问,你将在至少在沙滩上画了一条线来反对。这样你就可以阻止旧的kludge进入你可爱的新代码。
答案 1 :(得分:2)
您的问题有两个方面:
<强> 1。从代码中的不同位置访问公共代码的方法。
<强> 2。您在该公共代码中实现共享数据的方式。
即使您的项目很简单,仍然尝试使用它然后它将成为您的习惯。通常,是的,您可以使用静态类和单例模式,但是,在大型项目中,这是使用DI的最佳方法,允许更灵活并准备好进行测试。
所以,那就是“是”和“不”。通常,它们是线程安全的(类本身(通过MS定义)),但取决于您可能危险的某些逻辑的实现。
答案 2 :(得分:1)
静态方法你应该没问题。您需要注意的是静态数据。如果使用此选项,则每次要使用它时都需要对数据进行锁定。例如:
class Account
{
private static decimal balance;
private static Object thisLock = new Object();
public static void Withdraw(decimal amount)
{
lock (thisLock)
{
if (amount > balance)
{
throw new Exception("Insufficient funds");
}
balance -= amount;
}
}
}
答案 3 :(得分:0)
您不只是选择一种方法或另一种方法。你可以使用任何有意义的方法来做什么。如果您的方法仅与传递给它的数据交互,特别是如果该数据本身不共享(也是静态的)那么它可以是静态的。否则,您使用实例方法,但同样,这是根据具体情况做出的决定,而不是整个应用程序的确定。