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 @   元点  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示