parsingCOM互操作types时出现SimpleInjector ActivatorException

当试图从我的Simple Injector容器中parsing一个types时,它抛出了一个ActivatorException说我的types没有被注册,虽然我确信它已经被注册了。

ThisAddin.cs

  private void ThisAddIn_Startup(object sender, EventArgs e) { var container = new Container(); container.RegisterSingleton<Microsoft.Office.Interop.Excel.Application>(() => this.GetHostItem<Microsoft.Office.Interop.Excel.Application>( typeof(Microsoft.Office.Interop.Excel.Application), "Application")); var application = container.GetInstance<IApplicationAdapter>(); } 

在另一个大会,在这种情况下ExcelInterface

ApplicationAdapter.cs

 internal class ApplicationAdapter : IApplicationAdapter { public Application(Microsoft.Office.Interop.Excel.Application excelApplication) { } } 

IApplicationAdapter.cs

 public interface IApplicationAdapter { } 

但是,当涉及到解决Excel.Application我得到的exception:

在这里输入图像说明

所以试图debugging这个我以为它没有真正注册正确,但是当检查在容器中添加的注册,我可以看到Excel.Application已被添加:

在这里输入图像说明

我也检查,并100%确定这两个类是引用相同的Excel.Application程序集,他们是。

最后,我将Excel.Application实例添加到容器,但因为这是一个__COMObject我无法注册为Excel.Application

我完全不知道为什么Simple Injector无法正确parsing界面。

我不知道为什么会发生这种情况。 我可以确认在尝试注册这个例子时发生exception。

用你想要做的,我同意史蒂文的评论,yuck! 在应用程序对象上创build自己的,可能的多个抽象应该是要走的路。

然而,你想要的是可能的一些小的变化。 而不是注册应用程序对象本身,抛出一些奇怪的原因,你可以注册一个IApplicationProvider像这样:

 internal interface IApplicationProvider { Excel.Application CurrentApplication { get; } } class ApplicationProvider : IApplicationProvider { public ApplicationProvider(Excel.Application application) { this.CurrentApplication = application; } // c# 6 syntax public Excel.Application CurrentApplication { get; } } 

你可以注册为:

 var container = new Container(); var app = this.GetInstance<Microsoft.Office.Interop.Excel.Application>("Application"); var appicationProvider = new ApplicationProvider(app); container.RegisterSingleton<IApplicationProvider>(appicationProvider); //Make other registrations.... container.Verify(); 

为了提高可读性,我做了一个小辅助方法:

 public TInstance GetInstance<TInstance>(string key) where TInstance : class { return this.GetHostItem<TInstance>(typeof (TInstance), key); } 

无处不在你现在需要的应用程序对象,你可以只注入IApplicationProvider和使用像这样:

 class SomeService { private readonly IApplicationProvider applicationProvider; public SomeService(IApplicationProvider applicationProvider) { this.applicationProvider = applicationProvider; } public int GetWorkbookCount() { return this.currentApplication.Workbooks.Count; } // c# 6 syntax private Excel.Application currentApplication => this.applicationProvider.CurrentApplication; } 

经过Office 2016testing,并按预期工作。

Interesting Posts