【问题标题】:In C#, how can I get the name of the calling project from within a referenced project?在 C# 中,如何从引用的项目中获取调用项目的名称?
【发布时间】:2013-09-13 21:26:05
【问题描述】:

我有三个项目:My.Business、My.WebSite 和 My.WebService

我需要我的日志记录类能够识别来自网站和网络服务的请求。我曾经让 Web 服务作为网站下方的单独应用程序运行,所以我只使用不同的配置文件,效果很好。但我现在希望 Web 服务在同一个应用程序下运行。

如果我能确定请求是来自 My.WebSite 还是 My.WebService,我会做好准备,但我不知道该怎么做。

  • Assembly.GetExecutingAssembly() 返回 My.Business
  • Assembly.GetEntryAssembly() 为空
  • 我可以检查 StackTrace,但这似乎很草率,我必须如何返回?特别是因为日志记录可能由 My.Business 中最初从其他项目之一调用的代码触发。

由于 Web 服务请求以“.asmx”结尾,因此以下概念有效,但感觉不对。

return HttpContext.Current.Request.Path.IndexOf(".asmx") >= 0 ? "My.WebService" : "My.WebSite";

谢谢!

【问题讨论】:

  • 我想说你可以在这里做一些控制反转; My.Business 类应该被“给予”他们工作所需的信息(以不同的方式),而不是试图找到它......如果你引入第三个应用程序怎么办......现在你必须再次更改 My.Business .
  • 我考虑过这一点,但日志记录发生在所有三个项目中。所以我不确定如何让 My.Business 进行日志记录并传递有关是否登录到 WebSite 或 WebService 的信息。

标签: c# c#-4.0 reflection log4net log4net-configuration


【解决方案1】:

您应该可以使用 Assembly.GetCallingAssembly():

return Assembly.GetCallingAssembly().FullName;

这将返回调用当前执行方法的程序集,因此您可以捕获以这种方式调用 My.Business 程序集的任何人。

话虽如此,我倾向于同意 Meirion Hughes 的上述评论。您可能想考虑将任何所需的信息传递给您的日志记录类,特别是如果将来可能在更多应用程序中使用它。

【讨论】:

  • 返回 My.Business
  • 另外,我不想要调用当前执行方法的程序集,因为日志记录可能是从 My.Business 中的函数触发的。我想让它知道是 My.WebSite 还是 My.WebService 发起了它。
  • 我猜它正在返回“My.Business”,因为正如您在第二条评论中所描述的,您的日志记录方法不是您的程序集的入口点。当您将 BLL 对象实例化为私有成员或属性并根据需要引用它时,您可以捕获调用程序集。
【解决方案2】:

this.GetType().Assembly.FullName 将为您提供当前类的程序集名称。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2013-04-13
    • 2018-02-10
    • 2023-02-02
    • 1970-01-01
    • 2019-11-23
    • 2011-12-04
    • 2010-11-15
    • 2022-01-20
    相关资源
    最近更新 更多