При попытке разрешить тип из моего контейнера Simple Injector он бросает ActivatorException
, говоря, что мой тип не зарегистрирован, хотя я уверен, что он был.SimpleInjector ActivatorException при разрешении типа COM-взаимодействия
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
я получаю исключение, как:
Так пытается отлаживая это, я думал, что это не было LY был зарегистрирован правильно, но при проверке добавленных регистраций в контейнере, я могу видеть, что Excel.Application
было добавлено:
Я также проверил и сделал 100% уверен, что два класса ссылки на такой же Excel.Application
сборка который они.
Наконец, я бы добавил экземпляр Excel.Application
в контейнер, но так как это __COMObject
Я не могу зарегистрировать его как Excel.Application
.
Я совершенно не понимаю, почему Simple Injector не может правильно разрешить интерфейс.
Что бы вы хотели, чтобы я опубликовал? Это все, что я делаю для обработки Excel.Application'. Я не создаю его, и все, что я пытаюсь сделать, это зарегистрировать его в контейнере, как указано выше. –
Вы непосредственно вводите COM-объекты в свои приложения? Тьфу! Это может быть нарушение принципа инверсии зависимостей. В DIP указано, что ваши классы должны разговаривать с конкретными абстракциями приложения. Вероятно, это означает, что вы создаете адаптер, который обертывает COM-объект. Это не позволяет вам вводить COM-объект. COM-объекты такие, потому что вы разговариваете с прокси. Такой прокси-объект может заставить SI видеть два разных типа; это может беспокоить вас. – Steven
Да, это очень здорово. Но я ввожу его, так что мне не нужно создавать свой «ApplicationAdapter», а затем добавлять его в контейнер. Я бы не хотел, если бы с помощью перегрузки, которая принимает значение «Func», будет создаваться тип upfront и будет основываться на интерфейсе Excel.Application, который я регистрирую как? Как я вижу, в контейнере есть интерфейс 'Excel.Application'. –