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", "测试");
}
}
}

posted @ 2022-04-18 17:12  元点  阅读(108)  评论(0)    收藏  举报