跨MVC Web应用程序集中通用代码的最佳方法?

时间:2014-11-04 16:38:05

标签: c# asp.net asp.net-mvc

我正在使用ASP.NET MVC 5重写经典的asp web应用程序。

目前,在我的新应用程序中需要复制的包含文件中有许多常用代码。

我做了很多研究,并相信静态方法是可行的方法。

我打算对只使用本地数据或输入参数(除了对象)的实用程序使用静态方法

我计划对需要实例化其他对象等的实用程序使用实例方法。

我的问题是:

将IIS设置为InProc,静态方法是自包含的,还是可能被其他用户无意中交叉引用?

此应用程序将安装在单个服务器上,没有Web场或服务器集合等。

我也看过提到的扩展方法,但微软建议谨慎使用这些方法。最终,是否有更好的方法来替换静态方法以外的包含文件中的公共代码?

感谢阅读。

4 个答案:

答案 0 :(得分:2)

暂且不谈架构辩论(在经典的ASP中,实用程序中的数据访问的一小部分是常见的 - 我认为你不想复制那个MVC,更好的是设计一些漂亮的层并抽象出所有数据处理你的模型)。

要回答您的主要问题,只要您不访问全局变量,静态方法就是自包含的。即

public static string somestring = "xyz";
public static void DoSomething()
{
   somestring = "something else";

}

真的很糟糕,在多用户环境中分崩离析。

要回答你的最后一个问题,请参阅我的第一段。最好的方法是将模型(数据访问全部)开发到域模型中,数据访问层是其中的一个重要组成部分。至少重构数据访问方法到某种形式的DataAccess层,封装在一组接口后面 - 即使你现在没有时间/资源以更好的方式重写数据访问,你将在至少在沙滩上画了一条线来反对。这样你就可以阻止旧的kludge进入你可爱的新代码。

答案 1 :(得分:2)

您的问题有两个方面:

<强> 1。从代码中的不同位置访问公共代码的方法。

<强> 2。您在该公共代码中实现共享数据的方式。

  1. 尝试使用IoC(Inversion of Control)并实际使用Dependency Injections
  2. 即使您的项目很简单,仍然尝试使用它然后它将成为您的习惯。通常,是的,您可以使用静态类和单例模式,但是,在大型项目中,这是使用DI的最佳方法,允许更灵活并准备好进行测试。

    1. 这是一个非常简单的问题。实际上这是ASP.NET基础知识(除非我误解了你的问题):是的,任何用户都可以访问静态方法(而不是类)。
    2. 所以,那就是“是”和“不”。通常,它们是线程安全的(类本身(通过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;
        }
    }
}

http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

答案 3 :(得分:0)

您不只是选择一种方法或另一种方法。你可以使用任何有意义的方法来做什么。如果您的方法仅与传递给它的数据交互,特别是如果该数据本身不共享(也是静态的)那么它可以是静态的。否则,您使用实例方法,但同样,这是根据具体情况做出的决定,而不是整个应用程序的确定。