我的团队正试图找出在我们的自定义程序集中管理集中常量(可能是只读静态变量)的最佳方法。我们构建了一个处理体系结构,其中程序集被动态加载到运行时。当数据通过我们的系统时,一些程序集将信息写入字典,然后传递给另一个将读出数据并处理它的程序集。随着我们的产品成熟并且我们的客户需要不同的处理能力,我们将需要添加将被写入/读取的新数据字段。到目前为止,我们已经在我们的核心dll中定义了常量,但这不会长期工作,因为当我们获得新的数据时,我们将不得不重新编译核心dll,并且这样做我们的测试团队将不得不完全回归测试整个应用程序,而不仅仅是测试新程序集提供的新功能。试图找出一种方法来添加新的常量并知道正在编写什么数据,而无需重新编译/部署我们并非绝对必须的任何内容。
我们考虑了两个选择:
创建一个常量dll,它只保存常量。什么时候我们 需要我们添加(永远不会删除)它们到dll的新字段。下来 这方面的一个改变是dll仍然会影响整个 系统,因此可能需要进行完整的回归测试。
让每个程序集公开它读/写的所有字段, 然后在开发人员集成期间查找名称不匹配。对于 示例Assembly1写入(Field1,Field2)和Assembly2读取 (field1,Filed2),导致(Field1与field1)不匹配 字典键区分大小写。这将使我们无法拥有 常量程序集,但它需要一些额外的代码 错配验证,似乎引起了一些耦合。
注意:当我说常量时,我并不是指常数。根据我们最终的解决方案,我们可能会使用只读静态。
如果有人做过这样的事情,或者对完成此事的方法有任何想法,我将非常感谢您的意见。我们的基本目标是仅通过部署新程序集来提供新功能。
答案 0 :(得分:0)
根据您的评论,这听起来应该是您应该使用DTO课程。而不是带有值的字典
dict["PrimaryAddress"] = "123 Someroad St.";
dict["Name"] = "John Doe";`
你应该有一个对象
public class Address
{
public string PrimaryAddress { get; set; }
public string Name { get; set; }
}
....
new Address {
PrimaryAddress = "123 Someroad St.",
Name = "John Doe",
};
为方便起见,您可以在核心库中创建一个基类,该基类为所有类定义一些标准行为(例如,public Dictionary<string, string> ConvertToDictionary()
用于遗留用途),然后每个程序集都可以从中继承以创建它们自己的对象。然后,使用它们的程序集可以引用生成程序集并将其视为特定类型,或者它可以将其视为基本表单并使用基本功能。
答案 1 :(得分:0)
您可以做的是创建一个程序集,该程序集由您的流程中的所有其他程序集引用。 (请注意,我假设您的应用程序中实际只有一个进程)。 这个程序集将公开一个类来保存这些“常量”。我们称之为会话。 以下是我们在其中一个项目中使用的实现:
//Defined in Dll appshared.dll
public static class MyApplication
{
static AppSession appSession = new AppSession();
public interface IAppSession
{
Object this[string key]
{
get;
set;
}
};
sealed class AppSession : IAppSession
{
Dictionary<String, Object> _session = new Dictionary<string, object>();
public AppSession()
{
}
public Object this[string key]
{
get
{
Object ret = null;
lock (_session)
{
_session.TryGetValue(key, out ret);
}
return ret;
}
set
{
if (key == null)
throw new ArgumentNullException();
try
{
lock (_session)
{
if (value != null)
_session[key] = value;
else
_session.Remove(key);
}
}
catch (Exception eX)
{
}
}
}
};
public static IAppSession Session
{
get
{
return appSession;
}
}
};
你可以按如下方式使用它:
//In Dll A referencing appshared.dll
MyApplication.Session["Const1"] = 1.0;//Set a global value
//In Dll B referencing appshared.dll
double const1 = (double)MyApplication["Const1"];//Read a global value - const1 will have the value set by Dll A
//In Dll C referencing appshared.dll
MyApplication.Session["Const1"] = null;//Delete a global value;
您当然可以存储您想要的任何类型的数据。您可以轻松修改它,不区分大小写。
我们还有一个复杂的会话对象,可以将值与配置文件同步,因此“常量”存储在执行中。但是,既然你没有提到你需要这样的能力,这个简单的类应该适合你。