寻找组合来自不同程序集的部分类的模式

本文关键字:分类 模式 程序集 组合 寻找 | 更新日期: 2023-09-27 18:02:19

我有以下问题。我有一个主项目,以及一些具有类似功能的额外项目。

例如:我有一个MVC网站,然后是一个类库项目"a"与"SettingsHelper"。这只是为配置设置定义了静态包装器,以便它们可以作为属性使用。

然后我有另一个类库项目"B",它包含一个"SettingsHelper类"。

我如何在我的主项目中合并这些SettingsHelpers,这样我就可以使用:SettingsHelper。属性。

我想能够插入额外的类库到一个项目。

寻找组合来自不同程序集的部分类的模式

听起来很像依赖注入。通常,您会将SettingsHelper公开为接口(您的契约),并根据它进行编程。然后,像Ninject、StructureMap或Windsor这样的DI容器会根据配置将该接口的实现插入到代码的相关部分中。

这将允许您根据已知的契约进行编码,并根据具体情况提供不同的库,然后DI框架可以使用该库来获得接口的具体实现。

您会同时需要这两个实例吗?

请注意,您不能在不同的程序集中使用partial关键字,只能在程序集中使用。

更新:根据你的评论,听起来你想做一些像构图。有一个类,它从任何一个库中获取两个类,并将它们组合成一个可以由应用程序使用的类。无论您是配置它来做一些特殊的事情,还是在库存在时加载类型,它都可以封装在这个新类中。

更新2:或者,查看MEF:

http://msdn.microsoft.com/en-us/library/dd460648.aspx

不行。部分类不能划分为程序集——它们不存在于CLR中,只存在于编辑器和编译器中。所以它们被编译成一个单独的CLR类。

你所能做的就是从其中一个继承另一个。然而,helper往往是静态类,所以这也行不通。

另一种选择是不编写助手类,而是编写扩展方法。可以使用在另一个程序集(或多个其他程序集)中定义的方法扩展一个程序集中的类。

我会说在第三个项目中移动两个Helper类,并将项目的引用添加到您的两个项目中。因此这个新库将成为共享数据结构和功能库

问候。

您所追求的特定模式称为外观模式。不幸的是,你不会从编译器那里得到任何帮助。本质:

  1. 在本地程序集中创建新的CombinedSettingsHelper类。
  2. 如果两个SettingsHelper类型在相同的命名空间中,您将需要为它们设置别名(检查解决方案资源管理器中的引用属性,并查看MSDN文档)。
  3. 实现对象,使其可以访问两个SettingsHelper对象。

为了清理您的外观,您可以尝试使用abstract object GetSettingValue(string name);这样的抽象方法。然后,facade可以继承相同的基类,并在其包含的子类上调用这些基类。例如:

public abstract class SettingsHelperBase { public object GetSettingValue(string settingName); }
// Assembly1
public class SettingsHelper : SettingsHelperBase { }
// Assembly2
public class SettingsHelper : SettingsHelperBase { }
public class SettingsHelper : SettingsHelperBase
{
    private List<SettingsHelperBase> _backends = new List<SettingsHelperBase>();
    public readonly PropertiesImpl Properties;
    public class PropertiesImpl
    {
        private SettingsHelper _settingsHelper;
        public string Name
        {
            get
            {
                return (string)_settingsHelper.GetSettingValue("Name");
            }
        }
        internal PropertiesImpl(SettingsHelper helper)
        {
            _settingsHelper = helper;
        }
    }
    public SettingsHelper()
    {
        _backends.Add(asm1::MyNs.SettingsHelper);
        _backends.Add(asm2::MyNs.SettingsHelper);
        Properties = new PropertiesImpl(this);
    }
    protected override object GetSettingValue(string settingName)
    {
        foreach (var item in _backends)
        {
            var val = item.GetSettingValue(settingName);
            if (val != null)
                return val;
        }
        return null;
    }
}

有办法;Visual Studio允许在多个项目中包含相同的代码文件。

当你执行"添加"/"现有项目"时,可以选择一个在不同文件夹中的文件。

这就是一些银光支持所做的,以便允许一个"公共类"具有仅在服务器上的一些方法和仅在客户端上的一个方法。

关于"好设计"的问题,你必须自己决定,许多人不喜欢在不同的项目中以不同的方式编译同一个类。
当XXX只在一个项目中定义时,如果使用#if XXX可能会造成混乱