我对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)回来'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);
}
}
}
就是这样,加载项加载,它们都被注册,我点击按钮 - 一个注册,一个不注册。
答案 0 :(得分:3)
要做出一个完全不知情的猜测,嵌入式互操作程序集中的Microsoft.Office.Interop.Outlook.MailItem
是一个COM类型吗? (请参阅.NET 4中的“无PIA”功能。)
如果是这样,可能存在多个类型的副本,仅通过应用于它们的GUID绑定在一起。 CLR允许这样做,将它们视为彼此可分配,但是当比较类型时(例如,查找注册),它们将有所不同。
我不知道直接的解决方法,但您可以通过创建自己的MailItem
类型来测试这个理论。使用您自己的类型作为通用参数应该可以解决问题。祝你好运!