[InheritedExport]
[LoginMetadata]
public interface ILogon
{
bool Authenticate ( string UserName, string Password );
}
public interface ILoginMetadata
{
string Name
{
get;
}
string Description
{
get;
}
}
[MetadataAttribute]
[AttributeUsage( AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false, Inherited = true )]
public class LoginMetadataAttribute : ExportAttribute, ILoginMetadata
{
public LoginMetadataAttribute ( )
: base( typeof( ILogon ) )
{
}
#region ILoginMetadata Members
public string Name
{
get;
set;
}
public string Description
{
get;
set;
}
#endregion
}
public class LogonPlugins
{
[ImportMany( typeof( ILogon ) )]
public List<Lazy<ILogon, ILoginMetadata>> Plugins
{
get;
set;
}
}
public static class Logon
{
private static LogonPlugins _Plugins = null;
private static AggregateCatalog _Catalog = null;
private static CompositionContainer _Container = null;
public static LogonPlugins Plugins
{
get
{
if ( _Plugins == null )
{
_Plugins = new LogonPlugins( );
_Catalog = new AggregateCatalog( );
_Catalog.Catalogs.Add( new AssemblyCatalog( Assembly.GetExecutingAssembly( ) ) );
_Container = new CompositionContainer( _Catalog );
_Container.ComposeParts( _Plugins );
}
return ( _Plugins );
}
}
}
此代码旨在使用Lazy模型加载类型为ILogon的扩展对象。 因为Lazy对象的方式必须继承ILogon,而必须还要声明LoginMetadata属性。 我真的不想强制使用LoginMetadata,因此我将其声明为可继承并将其添加到没有参数的接口。 我的问题是当我做在插件类上声明属性时,最终列表将包含两个相同插件类型的条目。一个用于在接口上声明的空属性 - 并继承;和一个用于在插件类上声明的属性。
有一种方法可以克服?
由于 彼得
答案 0 :(得分:0)
其中一个导出来自应用于ILogin接口的InheritedExport,第二个来自LoginMetadataAttribute属性,该属性也是ExportAttribute。您需要删除InheritedExport或从LoginMetadataAttribute中删除ExportAttribute基类型。
一般情况下,如果您使用元数据,它应该特定于给定的导出,因此我希望您应该从界面中删除InheritedExport,并期望人们导出ILogin以应用LoginMetadataAttribute并提供必要的元数据。如果这是您前往的路线,我建议将其重命名为LoginExportAttribute。