接上上一篇,我们再看看如何使用自定义导出特性
银行相关接口如图所示
【注意:使用强类型元数据(Using Strongly-typed Metadata)为了访问强类型的元数据,通过定义匹配只读属性(名称和类型)的接口创建元数据视图。下图中的IMetaData接口】
public interface ICard
{
//账户金额
double Money { get; set; }
//获取账户信息
string GetCountInfo();
//存钱
void SaveMoney(double money);
//取钱
void CheckOutMoney(double money);
}
public interface IMetaData
{
string CardType { get; }
}
为了使用比 ExportMetadata 更强类型,需要创建自定义特性 [System.ComponentModel.Composition.MetadataAttribute] 标识。
/// <summary>
/// AllowMultiple = false,代表一个类不允许多次使用此属性
/// </summary>
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ExportCardAttribute : ExportAttribute
{
public ExportCardAttribute() : base(typeof(ICard))
{
}
public string CardType { get; set; }
}
我们定义两个银行操作实现类:
[ExportCardAttribute(CardType = "BankOfChina")]
public class ZHCard:ICard
{
public double Money { get; set; }
public string GetCountInfo()
{
return "Bank Of China";
}
public void SaveMoney(double money)
{
this.Money += money;
}
public void CheckOutMoney(double money)
{
this.Money -= money;
}
}
[ExportCardAttribute(CardType = "BankOfAgricultural")]
class NHCard : ICard
{
public double Money { get; set; }
public void CheckOutMoney(double money)
{
this.Money -= money;
}
public string GetCountInfo()
{
return "Agricultural Bank Of China";
}
public void SaveMoney(double money)
{
this.Money += money;
}
}
那怎么导出使用呢?还下面事例代码,这里我是控制台程序
//其中AllowRecomposition=true参数就表示运行在有新的部件被装配成功后进行部件集的重组.
[ImportMany(AllowRecomposition = true)]
public IEnumerable<Lazy<ICard, IMetaData>> cards { get; set; }
static void Main(string[] args)
{
Program pro = new Program();
pro.Compose();
/*
foreach (var c in pro.cards)
{
Console.WriteLine(c.GetCountInfo());
}
*/
foreach (var c in pro.cards)
{
if (c.Metadata.CardType == "BankOfChina")
{
Console.WriteLine("Here is a card of Bank Of China ");
Console.WriteLine(c.Value.GetCountInfo());
}
if (c.Metadata.CardType == "BankOfAgricultural")
{
Console.WriteLine("Here is a card of Nong Ye Yin Hang ");
Console.WriteLine(c.Value.GetCountInfo());
}
}
Console.Read();
}
private void Compose()
{
var catalog = new DirectoryCatalog("Cards");
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
这样就可以OK了