跨多个程序集实现部分方法

时间:2011-01-24 13:46:54

标签: c# asp.net

在我正在开发的其中一个应用程序中,包括两个基本功能:创建和更新。

但是,有时需要添加自定义代码,所以我想通过允许第三方编写和嵌入自己的代码来扩展代码:

OnCreating OnCreated OnUpdating OnUpdated

有没有办法在多个程序集中启用上述功能? MEF可能在这方面有所帮助吗?

谢谢 此致


感谢所有人的回复。

具有这样的接口意味着每个外部组件必须根据需要实现该接口。那么,我的应用程序代码需要遍历当前运行的程序集,检测实现该接口的所有类,并运行它们的方法吗?

MEF适合吗?我可以从外部程序集导出实现并将其导入我的应用程序中吗?

谢谢 此致

7 个答案:

答案 0 :(得分:14)

您不能在程序集中使用粒子类,因为部分类是语言功能,而不是CLR功能。 C#编译器将所有的部分类合并为一个真正的类,并且该单个类是编译后唯一剩下的部分。

您有几种选择:

  1. 提供活动
  2. 将方法设为虚拟并覆盖它们
  3. 使用界面
  4. 您的问题看起来最适合事件。用户可以在其他程序集中订阅它们。

答案 1 :(得分:2)

关于您的MEF问题,您可以执行以下操作从界面运行方法:

var catalog = new DirectoryCatalog("bin");
var container = new CompositionContainer(catalog);
container.ComposeParts();

var plugins = container.GetExportedValues<IPlugin>();
foreach (IPlugin plugin in plugins)
{
    plugin.OnCreating();
}

或者像Brian Mains建议的那样创建一个包含事件的界面:

public interface IPlugin 
{
    event OnCreatingEventHandler OnCreating;
}

然后上面的代码更像是:

var catalog = new DirectoryCatalog("bin");
var container = new CompositionContainer(catalog);
container.ComposeParts();

var plugins = container.GetExportedValues<IPlugin>();
foreach (IPlugin plugin in plugins)
{
    plugin.OnCreating += MyOnCreatingHandler;
}

我认为我喜欢后者用于您指定的方法名称。对于我的插件工作,我创建了一个类似于以下内容的界面:

public interface IPlugin
{
    void Setup();
    void RegisterEntities();
    void SeedFactoryData();
}

RegisterEntities()方法在运行时扩展数据库模式,SeedFactoryData()方法添加任何默认数据(例如,添加默认用户,城市表的预填充等)。

答案 2 :(得分:1)

不支持跨程序集支持部分类。

原因是在编译期间所有部分类定义都合并为一个类。该单个类位于单个程序集中。

答案 3 :(得分:1)

考虑使用界面:

IUpdatableObject<X>
   Creating(X obj);
   Created(X obj);
   Updating(X obj);
   Updated(X obj);

然后使用此界面添加自定义代码;每个第三方都可以实现这个接口(无论是他们还是你可以通过包装器),这可以与添加自定义业务逻辑相关联。

HTH。

答案 4 :(得分:1)

您(或用户)可以使用扩展方法: http://msdn.microsoft.com/en-us/library/bb383977.aspx

答案 5 :(得分:0)

部分方法和类必须位于同一个程序集中。如果不使用,则编译出部分方法。如果您需要扩展点,您应该查看虚拟方法或事件。

答案 6 :(得分:0)

不支持跨程序集的部分类,因为部分类背后的概念是允许多个开发人员为特定名称空间下的同一个类贡献不同的方法和成员。 这样做是为了帮助开发人员将代码同步到一个类中,在一个程序集中,在编译后构建。