公共图书馆知道什么是上下文的最佳方式是什么 - a.k.a.调用应用程序 - 它在哪里?我处于一个非常受控制的企业环境中......有没有更好的方法让库知道调用哪个应用程序而不是读取配置文件中的设置?你对这类事情有什么用?
//the rest of the story
我在一家财富500强制造公司的Intranet团队工作。我创建了一个公共库,我们所有的新.Net应用程序都将使用它。它查询公共数据库以获取有关应用程序的信息以及与该问题无关的许多其他事项。可以想象,公共库需要知道应用程序在调用它。我可以强制每个应用程序在某个静态类或类似的东西上设置属性,但我想在幕后更多一点。目前,它要求开发人员在app.config或web.config中设置一个设置,其中包含ApplicationName的键和值 - 您猜对了 - 应用程序名称(这是我们唯一的非更改ID)。然后它使用当前它使用ConfigurationManager.AppSettings["ApplicationName"]
将其拉入。
答案 0 :(得分:3)
可能有办法做到这一点。因为我根本不打算回答你的实际问题,所以我很可能会因此得到投票,但我不能不说什么就继续前进。对我来说,这是可能的最差耦合的一个例子。您实际上必须查看数据库,并根据调用它的应用程序的不同行为?
答案 1 :(得分:1)
您也可以在公共库类中调用Assembly.GetEntryAssembly。
然后使用返回的程序集中的.Name属性。
这意味着您的appsettings表(或其他任何东西)需要通过程序集名称进行键控,并且如果程序集名称应该更改,那么它就会中断。这意味着您在命名/键选择方面的灵活性稍差。
答案 2 :(得分:0)
getenv()会为你提供环境变量,反过来应该给你你想要的东西。但一般来说,根据调用程序的名称具有不同的行为不被认为是最佳实践。如果您想在日志消息中打印出调用程序的名称,则会出现例外情况。当然还有其他例外情况,您的情况可能就是其中之一。
您也可以通过进程ID(w / getpid())获取信息。
答案 3 :(得分:0)
我在这里同意EBGreen。这对我来说是一个红旗问题。
那就是说,我建议与你所建议的完全相反,只需将密钥(应用程序名称或其他)作为参数传递给你正在调用的函数。您可以将它作为公共静态属性烘焙到程序中,无论您的入口点是什么,并创建一个小帮助函数,基本上会重载对存储库的调用。这会隐藏它并减少容易出错的重复。
更好的是,您还可以使您的入口点类实现一个接口,该接口具有获取应用程序名称的方法(它只返回一个字符串常量)以及用于设置从数据库返回的值的方法。将其命名为“IIntranetApp” “ 或者其他的东西。然后你只需将“this”传递给期望“IIntranetApp”的函数,它就会神奇地填充你的中央仓库所需的空白。
类似的东西:
public interface IIntranetApp
{
string GetApplicationName();
void SetConnectionString(string connectionString);
// etc... add methods as necessary
}