.NET AOP(MEF框架异常问题)

Zhang_Martin 2014-06-05 08:46:25
我1个工程 有4个项目
分别为
1:MEFInterface(接口)
就一个接口
public interface ICalculator
{
int Add(int a, int b);
}
2:MEFInfrastructure(实现接口)
[Export("MEFInterface.ICalculator", typeof(ICalculator))]
public class Calculator
: ICalculator
{
public int Add(int a, int b)
{
return a + b;
}
}

3:MEFRepository(通过MEF 依赖注入)
public class MyCalculator
{
[Import("MEFInterface.ICalculator", typeof(ICalculator))]
private ICalculator _calculato;
public int Add(int a, int b)
{
return _calculator.Add(a, b);
}
}
4:MEFsln
class Program
{
private static CompositionContainer _container;

static void Main(string[] args)
{
var assemblyCatalog = new AssemblyCatalog(typeof(MEFRepository.MyCalculator).Assembly);
_container = new CompositionContainer(assemblyCatalog);
MyCalculator calculator = new MyCalculator();
_container.ComposeParts(calculator);
Console.WriteLine(calculator.Add(1, 3));
Console.ReadLine();
}
}
当运行起来抛出
“System.ComponentModel.Composition.ChangeRejectedException”类型的未经处理的异常在 System.ComponentModel.Composition.CodePlex.dll 中发生



如果我把上面的
MEFInterface
MEFInfrastructure
MEFRepository
合并到一个项目中就不会抛出错误
调试的时候发现
public class MyCalculator
{
[Import("MEFInterface.ICalculator", typeof(ICalculator))]
private ICalculator _calculator ;//此行报错,不知道怎么修改。请解决上面方案里面代码问题
public int Add(int a, int b)
{
return _calculator.Add(a, b);
}
}
请不要动上面4个项目框架结构,我需要的是解决问题
...全文
219 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zhang_Martin 2014-06-08
  • 打赏
  • 举报
回复
大哥这是MEF 框架 你知道怎么用吗?? var assemblyCatalog = new AssemblyCatalog(typeof(MEFRepository.MyCalculator).Assembly); 这就是实例化!!
  • 打赏
  • 举报
回复
不论是对象还是类型,它的实例化代码都不能调试。因此遇到调试器无法准确调试时,要首先注意重构这些代码。
  • 打赏
  • 举报
回复
比如说你编写一个class,尽量不要把没绝对把握的代码放在.ctor方法中。许多代码可以放到运行时才初始化,例如
public class TA
{
    private TB _tb;

    public TB Node
    {
        get
        {
             if(_tb == null)
                 _tb = 初始化TB实例;
             return _tb;
         }
     }
......
如果你写成
public TB Node = 初始化TB实例;
或者干脆就是显示地在.ctor方法中写初始化代码,那么c#调试器无法帮助你准确调试,根本不能停留在真正出错的代码上,只能给出含糊其辞的运行时异常信息。 特别是当你使用分层框架,就更难调试。 所以养成好习惯,将你可能在此用到的自定义class,里边的实例化部分代码尽量延迟到.ctor之后才调用。这样你就可以避免”未经处理的异常“这个提示,调试器可以立刻给你准确的调试。
Zhang_Martin 2014-06-08
  • 打赏
  • 举报
回复
一楼的能不能说清楚点,二楼的这个方案我试过了 没有用。 求大侠解决
bwangel 2014-06-05
  • 打赏
  • 举报
回复
所谓的依赖注入,那肯定是各项目之间(比如主程序和接口实现两个类)之间没有形成硬性的项目引用咯。 那样的话,编译形成的dll不会放到主程序的根目录,你分成多个项目当然报错了。 你要把接口实现类库的输出指向主程序的bin\debug或bin\release.
zhujiazhi 2014-06-05
  • 打赏
  • 举报
回复
在最开始的地方把MEFInterface和MEFInfrastructure这两个程序集显示的加载一下 顺便说一下,可以换个头像不?

13,347

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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