通用示例接口(比如计算器功能接口)
public interface ICalculator
{
int GetNumber(int num1, int num2);
}
1.为导出附加元数据
使用 ExportMetadataAttribute 特性,应该这样(这里是加法运算)
[Export(typeof(ICalculator))]
[ExportMetadata("CalciMetaData", "Add")]
public class Add:ICalculator
{
#region Interface members
public int GetNumber(int num1, int num2)
{
return num1 + num2;
}
#endregion
}
我们再添加一个减法运算
[Export(typeof(ICalculator))]
[ExportMetadata("CalciMetaData", "Subtract")]
public class Subtract : ICalculator
{
#region Interface members
public int GetNumber(int num1, int num2)
{
return num1 - num2;
}
#endregion
}
=== [下面我们再看看如何导入使用] ===
public class CalciCompositionHelper
{
[ImportMany]
public System.Lazy<ICalculator, IDictionary<string, object>>[] CalciPlugins { get; set; }
/// <summary>
/// Assembles the calculator components
/// </summary>
public void AssembleCalculatorComponents()
{
try
{
//Step 1: Initializes a new instance of the
// System.ComponentModel.Composition.Hosting.AssemblyCatalog class with the
// current executing assembly.
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
//Step 2: The assemblies obtained in step 1 are added to the CompositionContainer
var container = new CompositionContainer(catalog);
//Step 3: Composable parts are created here i.e. the Import and Export components
// assembles here
container.ComposeParts(this);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// Sends the result back to the client
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
public int GetResult(int num1, int num2, string operationType)
{
int result = 0;
foreach (var CalciPlugin in CalciPlugins)
{
if ((string)CalciPlugin.Metadata["CalciMetaData"] == operationType)
{
result = CalciPlugin.Value.GetNumber(num1, num2);
break;
}
}
return result;
}
}