2012-07-19 2 views
2

저는 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>>(); 
    } 

나중에 내 최대 유선 전망 리본 버튼을 클릭 (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

나는 문제가 우리에게 보여주고있는 코드에 있다고 생각하지 않지만 코드에서는 그렇지 않다고 생각합니다. –

+0

그럴 수도 있지만, 어떻게 보이지 않습니다. 나머지는 지금 위에 추가됩니다. – raydenl

+0

명백히 Generic Interface IPrintService와 관련이 있습니다. 인터페이스에서 제네릭을 제거한 것처럼 그것은 컨테이너에 등록 된 상태로 유지됩니다. – raydenl

답변

3

완전히 알 수없는 추측을하려면 임베디드 interop 어셈블리에 Microsoft.Office.Interop.Outlook.MailItem COM 유형이 있습니까? (.NET 4의 "No PIA"기능 참조).

그렇다면 유형에 여러 개의 사본이 있으며, 적용되는 GUID로만 ​​묶일 수도 있습니다. CLR은이를 허용하여 상호 배정 할 수 있지만 유형을 비교 (예 : 등록 조회) 할 때 유형이 서로 다를 수 있습니다.

직접 해결 방법을 모르지만 Outlook 자체를 랩핑하는 자신의 MailItem 형식을 만들어이 이론을 테스트 할 수 있습니다. 자신의 유형을 제네릭 매개 변수로 사용하면 문제가 해결됩니다. 행운을 빌어 요!