2009-09-11 115 views
-1

我想添加一些功能,以书面,如每个模块/插件:属性或属性

作者,公司,日期等

,它表示它的来源以及是谁写的。然后程序员可以在一个DLL中有多个插件。我应该如何实现对这些支持,以便我可以在主应用程序UI中访问它们?通常1个插件是单个公共类。

我应该使用属性还是属性?我也应该使用接口?

我想让这些东西被程序员填充,而不是让它成为可选项。

+1

如果您使用插件编写应用程序,您可能需要查看http://www.codeplex.com/MEF – TrueWill 2009-09-11 17:21:15

+0

谢谢,不知道那个。 – 2009-09-11 17:23:11

回答

2

由于数据在技术上是关于类的元数据,而不是插件所需的实际状态,因此我会使用属性。属性旨在成为关于代码的元数据,这正是您想要的。

就实施它们而言,如果元数据丢失,您可能会让主机应用程序无法加载插件。这样,插件开发人员将无法在不提供数据的情况下测试插件。但是,您应该提供充足的文档,以便他们知道缺少的内容,或者在加载插件失败时提供详细的错误。

大多数程序集已经有一些在AssemblyInfo类中设置的基本信息(公司,版本等)。您也可以改为使用它。

此外,为了防止丢失的数据问题,您可以使用一个PluginAttribute,它将属性中的所有元数据作为参数,并要求您的主机加载该类的属性。我最初想要为每个要录制的内容添加一个属性,但是单个属性的效果会更好。

+0

谢谢。我可以通过编程访问AssemblyInfo的东西吗?如果是这样,可能正是我所需要的,但我必须考虑是否需要此插件或程序集的信息。 – 2009-09-11 17:20:55

+1

您可以在加载程序集来检查包含的类时,可以使用反射来获取程序集属性。 – NerdFury 2009-09-11 17:24:14

+0

也只是看到了你的最后一段。你能否详细解释一下? – 2009-09-11 18:05:49

5

我会使用一个接口,我自己。 好的一点是,您可以将其添加到现有类中,而不必重写现有代码,只需添加接口的属性/方法即可。

+0

谢谢。我仍然可以强制他们通过将接口添加到插件的必要接口来实现它,对吧? – 2009-09-11 17:16:43

+1

是的,这应该工作W/O任何问题 – 2009-09-11 17:19:36

0

个人而言,我会去的属性,但会分配值的构造函数中的后备只读属性。

两全其美。 :)

+0

谢谢,为什么你会使用属性? – 2009-09-11 17:14:53

+1

易用性。 – leppie 2009-09-11 19:09:13

+0

谢谢,我看到:) – 2009-09-11 20:12:15

1

如果您使用属性,这将使插件实施者注意他们是否忘记填写其中一个字段更难。随着一个抽象的财产,他们将被迫执行它,否则将面临编译错误:

public abstract class PluginBase 
{ 
    protected PluginBase() 
    { 
    } 

    public abstract string Author 
    { 
     get; 
    } 

    // ... 
} 

唯一的缺点是,这种信息是真正的元数据,所以你可能会说,属性看从“语义正确的更好“的角度。

2

我会去寻找属性,只是因为它听起来像你想跟踪的项目不需要成为应用程序的一部分,而是代码本身的装饰。另外,我认为程序员添加其他垃圾到这个并不属于真正属于的诱惑会更小,如果它是一个属性。

+0

是的,没错。他们只会在插件的关于部分显示。 – 2009-09-11 17:17:57

2

我认为使用接口是一种更好的方法。 因为每个想要编写插件的人都应该基于契约来实现它(实现一个接口或将某些属性放在他的类成员上),所以从插件开发人员的角度来看它并不重要,但它会是更容易,更结构化(我认为更快),以便您的程序根据接口识别和使用实现的类。

1

已经有attributs,所以为什么重新发明轮子?

using System.Reflection; 

[assembly: AssemblyTitle("my app")] 
[assembly: AssemblyDescription("good app")] 
[assembly: AssemblyConfiguration("")] 
[assembly: AssemblyCompany("mycorp")] 
[assembly: AssemblyProduct("my prod")] 
[assembly: AssemblyCopyright("Copyright © me 2009")] 
[assembly: AssemblyTrademark("")] 
[assembly: AssemblyCulture("")] 
[assembly: AssemblyVersion("1.0.0.0")] 

默认情况下,它们已存在于文件AssemblyInfo.cs中。

这是在组件中存储版本信息和其他元数据的标准方式。也许还有其他属性也是你感兴趣的,你也可以为它创建属性。

+0

谢谢,这很好,但每个装配只能有1个,对不对?我可能需要他们每个插件可以在一个单一的大会,我会看到如何做到这一点。 – 2009-09-11 17:22:20

+0

您可以为该属性创建自己的属性,并在属性类上使用[AttributeUsageAttribute(AttributeTargets.Class,AllowMultiple = false)]指定它适用于类,并且每个类可能不会多次使用相同的属性。 – codymanix 2009-09-11 17:28:15

+0

谢谢。我的意思是可能有多个。所以att#1可以在插件1-5中使用,而att#2可以在插件6-7中在同一个程序集中使用。 – 2009-09-11 17:34:37