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,并按预期工作。