AssemblyCatalog简单操作
1,说明:
通过AssemblyCatalog,获得有特殊标记特性的类对象集合,通过类型获取单一对象,并实现不同对象同一操作的不同业务
2,引用System.ComponentModel.Composition
3,代码
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
internal abstract class AutoRegistryPolicy
{
/// <summary>
/// 类型
/// </summary>
protected abstract string Type { get; }
/// <summary>
/// 对象
/// </summary>
static List<AutoRegistryPolicy> _list = null;
static AutoRegistryPolicy()
{
//获取程序集中所有标记了特性([Export(typeof(AutoRegistryPolicy))])的对象
using (var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()))
using (var container = new CompositionContainer(catalog))
{
_list = container.GetExportedValues<AutoRegistryPolicy>().ToList();
}
}
/// <summary>
/// 根据类型获取对象
/// </summary>
/// <param name="methodType"></param>
/// <returns></returns>
static AutoRegistryPolicy GetPolicy(string methodType)
{
if (string.IsNullOrEmpty(methodType))
throw new Exception("");
AutoRegistryPolicy policy = _list.FirstOrDefault(p => p.Type == methodType);
if (policy == null)
{
throw new Exception("");
}
return policy;
}
/// <summary>
/// 操作
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
protected virtual string Registry(string request)
{
throw new Exception("");
}
/// <summary>
/// 对操作封装
/// </summary>
/// <param name="methodType">类型</param>
/// <param name="request">请求</param>
/// <returns></returns>
public static string RegistryPackage(string methodType, string request)
{
AutoRegistryPolicy policy = GetPolicy(methodType);
return policy.Registry(request);
}
}
internal sealed class CommonRegistryPolicy : AutoRegistryPolicy
{
[Export(typeof(AutoRegistryPolicy))]
public static readonly AutoRegistryPolicy Instance = new CommonRegistryPolicy();
protected override string Type { get { return "test1"; } }
protected override string Registry(string request)
{
return request;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
var autoregionresult = AutoRegistryPolicy.RegistryPackage("test1", "测试");
}
}
}

浙公网安备 33010602011771号