寻找组合来自不同程序集的部分类的模式
本文关键字:分类 模式 程序集 组合 寻找 | 更新日期: 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类,并将项目的引用添加到您的两个项目中。因此这个新库将成为共享数据结构和功能库。
问候。
您所追求的特定模式称为外观模式。不幸的是,你不会从编译器那里得到任何帮助。本质:
- 在本地程序集中创建新的
CombinedSettingsHelper
类。 - 如果两个
SettingsHelper
类型在相同的命名空间中,您将需要为它们设置别名(检查解决方案资源管理器中的引用属性,并查看MSDN文档)。 - 实现对象,使其可以访问两个
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允许在多个项目中包含相同的代码文件。
当你执行"添加"/"现有项目"时,可以选择一个在不同文件夹中的文件。
这就是一些银光支持所做的,以便允许一个"公共类"具有仅在服务器上的一些方法和仅在客户端上的一个方法。
关于"好设计"的问题,你必须自己决定,许多人不喜欢在不同的项目中以不同的方式编译同一个类。