mef的文件名和shared的问题

ilikeff8 2020-01-11 08:23:35
当impactmany从多个dll导入多个实现时,容器有没有自带的方法可以方便的得之某实现所对应的文件名

另外,如果某个实现设置为shared共享单例,那多次调用而且调用方法里对一个公共变量加一,是不是相互影响,如果是多线程同时调用,是不是变量加一不是线程安全的
...全文
60 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilikeff8 2020-02-01
  • 打赏
  • 举报
回复
用其他办法搞定了,直接根据类名查DLL的程序集信息
github_36000833 2020-01-11
  • 打赏
  • 举报
回复
当impactmany从多个dll导入多个实现时,容器有没有自带的方法可以方便的得之某实现所对应的文件名 功能的导出方,可以加一些元数据,让使用方方便使用,比如使用ExportMetadataAttribute:
[Export(typeof(IAdd)), ExportMetadata(nameof(INameMetaData.Name), nameof(FastAdd))]
public class FastAdd : IAdd
{
    public int Add(int x, int y) { return x + y; }
}

[Export(typeof(IAdd)), ExportMetadata(nameof(INameMetaData.Name), nameof(SlowAdd))]
public class SlowAdd : IAdd
{
    public int Add(int x, int y) { System.Threading.Thread.Sleep(100); return x + y; }
}

public interface IAdd
{
    int Add(int x, int y);
}

public interface INameMetaData
{
    string Name { get; }
}
class Program
{
    [ImportMany(typeof(IAdd))]
    public IEnumerable<Lazy<IAdd, INameMetaData>> adders;
    public Program()
    {
        var catalog = new AggregateCatalog(new AssemblyCatalog(GetType().Assembly));
        new CompositionContainer(catalog).ComposeParts(this);
    }

    static void Main(string[] args)
    {
        var p = new Program();
        foreach(var adder in p.adders)
        {
            Console.WriteLine(adder.Metadata.Name + " : " + adder.Value.Add(3,4));
        }
        // 输出 
        // FastAdd : 7
        // SlowAdd : 7
    }
}
另外,如果某个实现设置为shared共享单例,那多次调用而且调用方法里对一个公共变量加一,是不是相互影响,如果是多线程同时调用,是不是变量加一不是线程安全的 使用一个公共方法,而不是变量,来实现并发安全,比如
public class My
{
    private int count;

    public int Increment()
    {
        return Interlocked.Increment(ref count);
    }
}
ilikeff8 2020-01-11
  • 打赏
  • 举报
回复
写错了,是importmany

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧