Я недавно столкнулся с ошибкой разрешения dependecy, которую я надеюсь, что кто-то здесь может объяснить.Любопытная ошибка разрешения зависимостей
У меня есть интерфейс, определенный в сборке 3rdparty (I3rdParty
), одна «общая» сборка, которая зависит от этой сборки и «клиентская» библиотека, которая зависит от «общей» сборки. Назовем их, 3rdparty.dll, common.dll и client.dll.
Клиент.dll не должен иметь зависимость от файла 3rdparty.dll.
в common.dll следующих был определен:
public static class Factory
{
public static object Create(I3rdParty ifc) { ... }
public static object Create(string value1, string value2, long? value3 = null) { ... }
}
Одним из фабричных методов был использован из client.dll как:
var instance = Factory.Create("SomeValue", "SomeValue2");
На данный момент все работало, как ожидалось.
Тогда параметр BOOL был введен первый фабричный метод в common.dll поэтому он стал:
public static object Create(I3rdParty ifc, bool value) { ... }
Затем сборка client.dll начал неудачу из-за отсутствующей зависимости к 3rdparty.dll, например, :
The type 'I3rdParty' is defined in an assembly that is not referenced...
Я предполагаю, что это имеет какое-то отношение, что методы теперь принимает такое же количество параметров (начиная с третьего по умолчанию параметров на второй метод создания в нулевое значение).
Но я думал, что он все равно сможет выбрать правильный метод Create, основанный на типе параметров. Может ли кто-нибудь объяснить причину поведения, которое я вижу?
Интересно. Вы испытываете ту же ошибку, если добавить 'Create (string)' (в состоянии, прежде чем вы добавили значение bool)? –
С другой стороны, если ваш метод 'Create (I3rdParty)' никогда не предназначен для использования вашим 'client.dll', почему бы не сделать его' internal' вместо 'public'? –
Да, но только если я должен был изменить client.dll, чтобы использовать этот метод Create. И да, в соответствии с приведенным выше примером, который, вероятно, был бы моим первым, хотя также :) В реальном сценарии, где я столкнулся с этим, оба метода создания были внутренними, а InternalsVisibleTo был установлен в client.dll, но я чувствовал это было к тому же вопросом. Код, приведенный выше, является упрощенным изолированным воспроизведением ошибки. Решение ошибки компилятора не является проблемой, просто надеялось, что кто-то сможет объяснить поведение. – Matsande