跨程序集的持续管理

时间:2012-11-14 14:59:45

标签: c# constants

我的团队正试图找出在我们的自定义程序集中管理集中常量(可能是只读静态变量)的最佳方法。我们构建了一个处理体系结构,其中程序集被动态加载到运行时。当数据通过我们的系统时,一些程序集将信息写入字典,然后传递给另一个将读出数据并处理它的程序集。随着我们的产品成熟并且我们的客户需要不同的处理能力,我们将需要添加将被写入/读取的新数据字段。到目前为止,我们已经在我们的核心dll中定义了常量,但这不会长期工作,因为当我们获得新的数据时,我们将不得不重新编译核心dll,并且这样做我们的测试团队将不得不完全回归测试整个应用程序,而不仅仅是测试新程序集提供的新功能。试图找出一种方法来添加新的常量并知道正在编写什么数据,而无需重新编译/部署我们并非绝对必须的任何内容。

我们考虑了两个选择:

  1. 创建一个常量dll,它只保存常量。什么时候我们 需要我们添加(永远不会删除)它们到dll的新字段。下来 这方面的一个改变是dll仍然会影响整个 系统,因此可能需要进行完整的回归测试。

  2. 让每个程序集公开它读/写的所有字段, 然后在开发人员集成期间查找名称不匹配。对于 示例Assembly1写入(Field1,Field2)和Assembly2读取 (field1,Filed2),导致(Field1与field1)不匹配 字典键区分大小写。这将使我们无法拥有 常量程序集,但它需要一些额外的代码 错配验证,似乎引起了一些耦合。

  3. 注意:当我说常量时,我​​并不是指常数。根据我们最终的解决方案,我们可能会使用只读静态。

    如果有人做过这样的事情,或者对完成此事的方法有任何想法,我将非常感谢您的意见。我们的基本目标是仅通过部署新程序集来提供新功能。

2 个答案:

答案 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;

您当然可以存储您想要的任何类型的数据。您可以轻松修改它,不区分大小写。

我们还有一个复杂的会话对象,可以将值与配置文件同步,因此“常量”存储在执行中。但是,既然你没有提到你需要这样的能力,这个简单的类应该适合你。

相关问题