.NET应用程序的域层是否可以自我意识到它是什么类型的应用程序?

时间:2013-08-03 21:40:37

标签: c# .net reflection

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

2 个答案:

答案 0 :(得分:1)

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

好奇,为什么这一点很重要?我认为域逻辑和持久性都应该是相同的,无论它被调用的地方。如果它确实需要表现不同,那么为什么不根据当前的上下文将额外的数据传递给service / model / repository /告诉如何操作。

答案 1 :(得分:1)

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

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

您可以通过选中System.Windows.Forms.Application.MessageLoop来判断您是否在WinForms应用中。虽然像HttpContext.Current这样只有你在UI线程上才有效。您还可以AppDomain.CurrentDomain.GetAssemblies()查看是否加载了System.Windows.Forms.dll。还有Environment.UserInteractive会告诉你使用UI运行WinForms,WPF或控制台应用程序。

有关如何确定您是否作为服务运行,请参阅this question

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

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