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

C# 跨MVC web应用程序集中通用代码的最佳方法?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在使用asp.NETMVC5重写一个经典的asp web应用程序 目前,include文件中有很多常用代码,我需要在新应用程序中复制这些代码 我做了很多研究,相信静态方法是可行的 我计划对只使用本地数据或输入参数而不是对象的实用程序使用静态方法 我计划对需要实例化其他对象等的实用程序使用实例方法 我的问题是: 当IIS设置为InProc时,静态方法是自包含的还是会被其他用户无意中交叉引用 此应用程序将安装在单个服务器上,没有web场或服务器集合等 我也看到过提到的扩展方法,但微软建议谨慎使用

我正在使用asp.NETMVC5重写一个经典的asp web应用程序

目前,include文件中有很多常用代码,我需要在新应用程序中复制这些代码

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

我计划对只使用本地数据或输入参数而不是对象的实用程序使用静态方法

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

我的问题是:

当IIS设置为InProc时,静态方法是自包含的还是会被其他用户无意中交叉引用

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

我也看到过提到的扩展方法,但微软建议谨慎使用这些方法。最终,除了静态方法之外,还有更好的方法来替换include文件中的公共代码吗


感谢您的阅读。

您应该可以使用静态方法。您需要注意的是静态数据。如果您使用此选项,则需要在每次使用数据时对其进行锁定。例如:

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;
        }
    }
}

您应该可以使用静态方法。您需要注意的是静态数据。如果您使用此选项,则需要在每次使用数据时对其进行锁定。例如:

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;
        }
    }
}

你不能只选择一种或另一种方法。你可以使用任何有意义的方法。如果您的方法只与传入的数据交互,特别是如果该数据本身不是共享的也不是静态的,那么可以将其设置为静态的。否则,您将使用实例方法,但同样,这是根据具体情况确定的,而不是针对整个应用程序确定一次。

您不仅仅选择一种方法或另一种方法。你可以使用任何有意义的方法。如果您的方法只与传入的数据交互,特别是如果该数据本身不是共享的也不是静态的,那么可以将其设置为静态的。否则,您将使用实例方法,但再次强调,这是根据具体情况做出的决定,而不是针对您的应用程序作为一个整体进行一次。

抛开经典ASP中的体系结构争论,实用程序中的数据访问是一个常见的问题-我认为您不想复制那个MVC,最好设计一些漂亮的层,并将所有数据处理抽象到模型中

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

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

}
在一个多用户的环境中会变得很糟糕,甚至崩溃


要回答你的最后一个问题,请看我的第一段。最好的方法是将数据访问模型all开发成一个域模型,其中数据访问层是一个动作。至少,将数据访问方法重构为某种形式的数据访问层,将其封装在一组接口后面——即使您现在没有时间/资源以更好的方式重写数据访问,您至少已经在沙地上划出了一条线来进行编程。这样,您就可以阻止旧的乱七八糟的东西进入您可爱的新代码

抛开经典ASP中的体系结构争论不谈,实用程序中的数据访问是常见的——我不认为你会想复制MVC,最好是设计一些漂亮的层,并将所有数据处理抽象到你的模型中

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

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

}
在一个多用户的环境中会变得很糟糕,甚至崩溃


要回答你的最后一个问题,请看我的第一段。最好的方法是将数据访问模型all开发成一个域模型,其中数据访问层是一个动作。至少,将数据访问方法重构为某种形式的数据访问层,将其封装在一组接口后面——即使您现在没有时间/资源以更好的方式重写数据访问,您至少已经在沙地上划出了一条线来进行编程。这样,您就可以阻止旧的乱七八糟的东西进入您可爱的新代码

你的问题有两个方面:

一,。从代码中的不同位置访问通用代码的方法

二,。在公共代码中实现共享数据的方式

试着使用国际奥委会和国际奥委会。 即使你的项目很简单,仍然尝试使用它,然后它将成为你的习惯。一般来说,是的,您可以只使用静态类和单例模式,然而,在更大的项目中,这是使用DI的最佳方法,允许更灵活和更易于测试

这个问题很简单。实际上,这就是ASP.NET的基础知识,除非我误解了你的问题:是的,静态方法,而不是任何用户都可以访问类。 所以,这是一个
“是”表示“否”。通常,根据MS的定义,这些类本身是线程安全的,但这取决于您对某些可能危险的逻辑的实现。

您的问题有两个方面:

一,。从代码中的不同位置访问通用代码的方法

二,。在公共代码中实现共享数据的方式

试着使用国际奥委会和国际奥委会。 即使你的项目很简单,仍然尝试使用它,然后它将成为你的习惯。一般来说,是的,您可以只使用静态类和单例模式,然而,在更大的项目中,这是使用DI的最佳方法,允许更灵活和更易于测试

这个问题很简单。实际上,这就是ASP.NET的基础知识,除非我误解了你的问题:是的,静态方法,而不是任何用户都可以访问类。

所以,这是肯定的,也是否定的。一般来说,根据MS的定义,类本身是线程安全的,但这取决于您对某些可能危险的逻辑的实现。

lock????静态数据的主要问题不是线程安全问题,而是它被所有用户共享。是的,而且当两个用户同时使用数据时,可能会有交叉引用。感谢beautifulcoder-非常好的回答,这证实了我对静态方法和,伟大的头部重新锁定-再次感谢-竖起大拇指。锁定????静态数据的主要问题不是线程安全问题,而是它被所有用户共享。是的,而且当两个用户同时使用数据时,可能会有交叉引用。感谢beautifulcoder-非常好的回答,这证实了我对静态方法和,非常好的抬头重新锁定-再次感谢-竖起大拇指。再次感谢-我松散地跟随DI,但我很难理解如何使用它。作为一个有助于我理解的示例,我有一个静态方法,它将参数添加到它接收的Oracle查询命令中。我将如何使用DI来实现这一点?用两个词来说。您有自己的服务,它可能只是内部行为的一个静态类,这取决于实现,但您必须通过DI接收一个服务实例,该实例可能只是一个单例。但是DI的思想是指定一些接口。您的类必须实现该接口。然后执行以下操作:var s=MyAppDependencyResolver.GetService;s、 所需的方法;b将服务参数定义为接口类型、传递给类(例如控制器构造函数)或属性。这些将由该控制器调用自动填充。您还应该指出当您请求某个接口的服务时将传递的类的实例。这通常在应用程序的init部分,看起来像myappdependencysolver.definedependence=>newmyserviceclass;这完全取决于您选择的依赖项解析程序。你应该好好想想。这在网络上很受欢迎,描述得也很好。再次感谢-你的帮助让我思考了很多。非常感谢。再次感谢-我不太了解DI,但我很难理解如何使用它。作为一个有助于我理解的示例,我有一个静态方法,它将参数添加到它接收的Oracle查询命令中。我将如何使用DI来实现这一点?用两个词来说。您有自己的服务,它可能只是内部行为的一个静态类,这取决于实现,但您必须通过DI接收一个服务实例,该实例可能只是一个单例。但是DI的思想是指定一些接口。您的类必须实现该接口。然后执行以下操作:var s=MyAppDependencyResolver.GetService;s、 所需的方法;b将服务参数定义为接口类型、传递给类(例如控制器构造函数)或属性。这些将由该控制器调用自动填充。您还应该指出当您请求某个接口的服务时将传递的类的实例。这通常在应用程序的init部分,看起来像myappdependencysolver.definedependence=>newmyserviceclass;这完全取决于您选择的依赖项解析程序。你应该好好想想。这在网络上很受欢迎,描述得也很好。再次感谢-你的帮助让我思考了很多。非常感谢。谢谢吉姆-我没有足够的经验来完全听从你的建议,所以我想提出我目前的解决方案,以供评论。我在MVC项目中添加了一个类库项目,该项目将模型作为单独的对象,由manager类管理。这些管理器类也在类库中,包含诸如getAllCustomers、getCustomerById等访问方法。这些方法包含用于查询oracle数据库的内联sql。在理想的情况下,您应该创建一个业务模型类库,向业务模型公开许多入口点,这些入口点将
e您的外观或服务层。然后,业务模型将在数据访问层上进行调用。。。然而,有很多方法可以实现你的目标。你的大纲听起来是朝着正确的方向迈出的一步,但是,我会更进一步,将所有的数据访问内容迁移到另一个类库中,这样你就有了:数据访问层->业务模型->带有UI模型的UI层。我应该补充一点,创建一组用于编程的接口总是一个好主意,因此,在一个公共库中创建一组接口,甚至一个接口,并让您实现它。然后使您的业务层依赖于接口,并在一个地方插入对DAL的引用。这样,当您再次访问时,您的DAL完全被抽象了,如果您决定实现新的数据功能,只要DAL仍然通过旧接口公开,那么您就可以随意重构。感谢Jim,这是一个很大的帮助-我说的UI层将只包含模型对象和,DAL将包含我创建的管理器类,业务层将包含控制器代码?最后,接口所指的公共库是类库吗?再次感谢-感谢。MVC只是表示层。是的,DAL将包含manager类,但业务层或业务模型将在一些简单的数据库/crud应用程序中包含任何业务逻辑。该层通常很少,例如ProcessOrderService之类的。MVC的东西都存在于表示/用户界面层控制器、视图模型、视图中——尽管您的模型可能会从业务层冒出,并在业务层上进行调用,而业务层又会调用DAL。所有这些都不是一成不变的,但以一些抽象和清晰的领域边界为目标总是好的。谢谢Jim-我没有足够的经验来完全遵循你的建议,所以我想提出我目前的解决方案供评论。我在MVC项目中添加了一个类库项目,该项目将模型作为单独的对象,由manager类管理。这些管理器类也在类库中,包含诸如getAllCustomers、getCustomerById等访问方法。这些方法包含用于查询oracle数据库的内联sql。在理想情况下,您应该创建一个业务模型类库,它向业务模型公开许多入口点,这些入口点将是您的外观或服务层。然后,业务模型将在数据访问层上进行调用。。。然而,有很多方法可以实现你的目标。你的大纲听起来是朝着正确的方向迈出的一步,但是,我会更进一步,将所有的数据访问内容迁移到另一个类库中,这样你就有了:数据访问层->业务模型->带有UI模型的UI层。我应该补充一点,创建一组用于编程的接口总是一个好主意,因此,在一个公共库中创建一组接口,甚至一个接口,并让您实现它。然后使您的业务层依赖于接口,并在一个地方插入对DAL的引用。这样,当您再次访问时,您的DAL完全被抽象了,如果您决定实现新的数据功能,只要DAL仍然通过旧接口公开,那么您就可以随意重构。感谢Jim,这是一个很大的帮助-我说的UI层将只包含模型对象和,DAL将包含我创建的管理器类,业务层将包含控制器代码?最后,接口所指的公共库是类库吗?再次感谢-感谢。MVC只是表示层。是的,DAL将包含manager类,但业务层或业务模型将在一些简单的数据库/crud应用程序中包含任何业务逻辑。该层通常很少,例如ProcessOrderService之类的。MVC的东西都存在于表示/用户界面层控制器、视图模型、视图中——尽管您的模型可能会从业务层冒出,并在业务层上进行调用,而业务层又会调用DAL。所有这些都不是一成不变的,但以抽象和清晰的领域边界为目标总是好的。