0

公共库了解它所在的上下文(即调用应用程序)的最佳方式是什么?我在一个非常受控的企业环境中......有没有比读取配置文件中的设置更好的方法让库知道从哪个应用程序调用它?你用什么来做这种事情?

//the rest of the story
我在一家财富 500 强制造公司的 Intranet 团队工作。我创建了一个公共库,我们所有的新 .Net 应用程序都将使用它。它查询公共数据库以获取有关应用程序的信息以及与问题无关的许多其他内容。可以想象,公共库需要知道调用它的应用程序。我可以强制每个应用程序在某个静态类或其他东西上设置一个属性,但我想让它在幕后更深入一点。目前,它要求开发人员在 app.config 或 web.config 中放置一个设置,其键为 ApplicationName,值为 - 你猜对了 - 应用程序名称(对我们来说,这是一个唯一不变的 id)。然后它使用当前它用来ConfigurationManager.AppSettings["ApplicationName"]将其拉入。

4

4 回答 4

3

可能有办法做到这一点。我很可能会对此投反对票,因为我根本不打算回答你的实际问题,但我不能不说什么就继续前进。对我来说,这是可能出现的最糟糕的耦合示例。您实际上必须查看数据库并根据调用它的应用程序表现出不同的行为?

于 2008-10-16T22:04:52.597 回答
1

您也可以在公共库类中调用Assembly.GetEntryAssembly 。

然后使用返回程序集中的 .Name 属性。

这意味着那些,你的 appsettings 表(或任何它)需要由程序集名称作为键,并且如果程序集名称应该更改它会全部中断。这意味着您在此处的命名/键选择上的灵活性稍差。

于 2008-10-16T22:47:18.283 回答
0

我在这里同意EBGreen。这对我来说是一个危险信号。

也就是说,我建议与您的建议完全相反,只需将密钥(应用程序名称或其他)作为参数传递给您正在调用的函数。您可以将它作为公共静态属性烘焙到程序中,无论您是入口点是什么,并制作一个小辅助函数,该函数基本上会重载对存储库的调用。这将隐藏它并减少容易出错的重复..

更好的是,您还可以让您的入口点类实现一个接口,该接口具有获取应用程序名称的方法(它只返回一个字符串常量)和用于设置从数据库返回的值的方法。称之为“IIntranetApp”之类的. 然后你只需将“this”传递给一个期待“IIntranetApp”的函数,它就会神奇地填补你的中央仓库所需的空白。

就像是:

public interface IIntranetApp
{
    string GetApplicationName();
    void SetConnectionString(string connectionString);
    // etc... add methods as necessary
}
于 2008-10-16T22:41:42.053 回答
0

getenv() 将为您提供环境变量,这反过来应该给您您想要的。但通常,根据调用程序的名称具有不同的行为并不是最佳实践。如果您想在日志消息中打印出调用程序的名称,则例外。当然还有其他的例外,你的情况可能就是其中之一。

您也可以通过进程 id (w/getpid()) 获取信息。

于 2008-10-16T22:14:53.823 回答