Autofac注册问题

3

我对Autofac非常陌生并且遇到了一个问题。

以下代码是我如何注册依赖项的方式,之后我会检查它们是否都已经被注册并且都返回“true”。

public AddInBootstrapper(Microsoft.Office.Interop.Outlook.NameSpace session)
    {
        var containerBuilder = new ContainerBuilder();

        containerBuilder.Register(c => new OutlookService(session)).As<IOutlookService>();
        containerBuilder.RegisterType<EmailPrintService>().As<IPrintService<Microsoft.Office.Interop.Outlook.MailItem>>();

        _container = containerBuilder.Build();

        var blah1 = _container.IsRegistered<IOutlookService>();
        var blah2 = _container.IsRegistered<IPrintService<Microsoft.Office.Interop.Outlook.MailItem>>();
    }

当我点击我的已连接的Outlook功能区按钮时,第一个(blah1)显示为已注册,第二个(blah2)返回“false”。
private void printNowButton_Click(object sender, RibbonControlEventArgs e)
    {
        var blah1 = Globals.ThisAddIn.Core.IsRegistered<IOutlookService>();
        var blah2 = Globals.ThisAddIn.Core.IsRegistered<IPrintService<Microsoft.Office.Interop.Outlook.MailItem>>();

        var outlookSvc = Globals.ThisAddIn.Core.Resolve<IOutlookService>();
        var printSvc = Globals.ThisAddIn.Core.Resolve<IPrintService<Microsoft.Office.Interop.Outlook.MailItem>>();

        var folder = outlookSvc.GetFolder(@"public folders\all public folders\testpf\docprinttest\anotherfolder");

        foreach (Microsoft.Office.Interop.Outlook.MailItem item in folder.Items)
        {
            if (item.Attachments.Count > 0)
            {
                // print attachments
            }

            printSvc.PrintItem(item);
        }
    }

有什么想法吗?

编辑(以下是代码的其余部分):

该过程始于Outlook插件加载时:

public partial class ThisAddIn
{
    private AddInBootstrapper _core;
    public AddInBootstrapper Core
    {
        get { return _core; }
    }

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
    }

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        _core.Dispose();
    }

    public override void BeginInit()
    {
        _core = new AddInBootstrapper(this.Application.Session);

        base.BeginInit();
    }

    // some VSTO generated code here (non-modified)
}

IPrintService.cs:

namespace MRP.Outlook.DocPrint.Core.Services.Interfaces
{
  public interface IPrintService<T>
  {
      void PrintItem(T item);
  }
}

EmailPrintService.cs:

namespace MRP.Outlook.DocPrint.Core.Services
{
  public class EmailPrintService : IPrintService<Microsoft.Office.Interop.Outlook.MailItem>
{
    public EmailPrintService()
    {
    }

    public void PrintItem(Microsoft.Office.Interop.Outlook.MailItem item)
    {
        //item.PrintOut();
        System.Diagnostics.Debug.WriteLine("Printing: " + item.Subject);
    }
  }
}

那就是这样,插件已经加载,它们都已注册,我点击按钮——其中一个已注册,另一个没有。

我认为问题不在你展示给我们的代码中,而是在你没有展示的代码中。 - Jim Bolla
也许是这样,但我不知道怎么回事。现在上面添加了其余内容。 - raydenl
显然与通用接口IPrintService有关,如果我从该接口中删除通用部分,则它仍将在容器中注册。 - raydenl
1个回答

4
为了完全不知所措地猜测, Microsoft.Office.Interop.Outlook.MailItem 是一个嵌入式互操作程序集中的COM类型吗? (请参见.NET 4中的“无PIA”功能)。
如果是这样,那么可能存在该类型的多个副本,仅由应用于它们的GUID绑定在一起。 CLR允许这样做,并将它们视为可相互赋值,但是当比较这些类型时(例如查找注册表),它们将不同。
我不知道有没有直接的解决方法,但你可以通过创建自己的 MailItem 类型来测试这个理论。将您自己的类型用作通用参数应该解决此问题。祝好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接