2012-07-19 115 views
2

我對Autofac非常陌生,並且遇到問題。Autofac註冊問題

下面的代碼是我如何註冊我的依賴關係,之後我檢查它們是否都是(blah1/blah2)註冊,並且都返回'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)回來「假」

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); 
    } 
    } 
} 

就是這樣,加載項加載,他們都註冊,我點擊按鈕 - 一個是註冊,一個不是。

+0

我不認爲問題出現在您向我們展示的代碼中,但在代碼中您不是。 – 2012-07-19 17:20:24

+0

可能是這樣,但我不知道如何。其餘部分現在添加。 – raydenl 2012-07-19 21:22:52

+0

顯然與通用接口IPrintService有關,就好像我從該接口刪除泛型一樣,它仍然在容器中註冊。 – raydenl 2012-07-19 21:41:39

回答

3

要做出完全不知情的猜測,是Microsoft.Office.Interop.Outlook.MailItem在嵌入式互操作程序集中的COM類型? (請參閱.NET 4中的「無PIA」功能)。

如果是這樣,則可能有多個該類型的副本,僅通過應用於它們的GUID綁定在一起。 CLR允許這樣做,將它們視爲可分配給對方,但在對類型進行比較(例如查找註冊)時,它們會有所不同。

我不知道直接的解決方法,但是您可以通過創建自己的MailItem類型來包裝Outlook版本來測試此理論。使用自己的類型作爲通用參數應該可以解決問題。祝你好運!