1

我有一个具有多个多线程前端(web mvc、wcf 服务、winforms、windows 服务)的应用程序,它们都使用同一个持久层。我很好奇是否有办法让断开的层(例如我的持久层)自行确定创建它的这个实例的前端类型?我希望也许有一种方法可以使用反射来确定它是否在 httpcontext、applicationcontext 等中运行?

4

2 回答 2

1

您可以通过检查不同的静态属性来了解您的环境。尽管这些都不是万无一失的。

您可以通过检查HttpContext.Current是否为空来判断您是否在 Web 应用程序中运行(您至少可以判断您是否在 Web 线程上)。这就是结构图使用的。

您可以通过检查System.Windows.Forms.Application.MessageLoop来判断您是否在 WinForms 应用程序中。尽管像 HttpContext.Current 一样,这仅在您在 UI 线程上时才有效。您还可以AppDomain.CurrentDomain.GetAssemblies()查看 System.Windows.Forms.dll 是否已加载。还有Environment.UserInteractive会告诉您使用 UI 运行,无论是 WinForms、WPF 还是控制台应用程序。

请参阅此问题以了解如何确定您是否作为服务运行。

对于 WCF,您应该能够检查OperationContext.Current。这将告诉您是否正在运行 WCF 请求的上下文。

当然,您的领域层真的不应该检查所有这些事情,因为它不应该关心。如果它需要对不同的前端采取不同的行动,则前端应该使用接口实现来注入该行为以提供该行为。

于 2013-08-04T01:38:05.263 回答
1

您可以尝试分析当前进程上下文,以猜测启动它的可执行文件,或者可能是父进程的属性。例如,如果Process.GetCurrentProcess().ProcessNameYourWinformProject,它是从 Winforms 上下文启动的,但如果它是 IIS/Apache 的可执行文件的名称,则它作为网页运行。不过,两者都不是 100% 可靠的。

只是好奇,为什么这很重要?我认为域逻辑和持久性都应该是相同的,无论它从哪里被调用。如果它真的需要表现不同,为什么不根据当前上下文将额外的数据传递给服务/模型/存储库/告诉如何采取行动的任何东西。

于 2013-08-03T22:10:50.170 回答