Вам необязательно вносить какие-либо изменения в код приложения или базы, чтобы ссылаться на один из классов в AdvanceFeatures (например, var MyItem = ENV.foo.bar ();), поскольку var неявно является тем, что возвращается bar, вам не нужно было бы менять этот код, если bar изменился, чтобы вернуть другой тип (при условии, что в нем все еще использовались какие-либо методы и т. д.). Это все еще не может быть проблемой в вашем случае.
я есть исходный код, полученный от внешнего разработчика, этот код разделен на 4 типа проектов: их структура, среда для моего проекта (назовем его «ENV»), база приложения (назовите его «Base») и само приложение (около 20 dll я в совокупности назову «приложение»).
Теперь я добавил еще один слой к этому беспорядку, dll под названием AdvanceFeatures. Он лежит прямо под ENV (сверху каркаса). Эта dll ссылается только на структуру, и ENV ссылается на нее. Только ENV использует эту dll AdvanceFeatures, в то время как Base и App используют только ENV.
Я работаю здесь так, что большинство объектов в приложении определены в Base и наследуют / реализуют классы / интерфейсы в ENV. Также небольшая часть этих объектов (в App и Base) наследует / реализует классы / интерфейсы от самой платформы (но это довольно редко).
Пока все хорошо, кроме одного факта. Компилятор требует, чтобы я добавил ссылку на DLL-файл AdvanceFeatures из каждой библиотеки в App и из Base.
Я не использую AdvanceFeatures за пределами ENV, так зачем нужны эти ссылки?
Изменить: я создал демонстрационный проект для этой проблемы. Это детали проекта:
Assembly: AdvanceFeatures
References: Nothing (Reference project-folder is empty)
Classes: Decorator, IEnvClass, IDecorator
IDecorator contents:
namespace AdvanceFeatures
{
public interface IDecorator
{
IEnvClass Decorated { get; }
void Decorate();
}
}
IEnvClass contents:
namespace AdvanceFeatures
{
public interface IEnvClass
{
string Name { get; set; }
}
}
Decorator contents:
namespace AdvanceFeatures
{
public class Decorator : IDecorator
{
public Decorator(IEnvClass decorated)
{
Decorated = decorated;
}
#region Implementation of IDecorator
public IEnvClass Decorated { get; set; }
public void Decorate()
{
Decorated.Name = "NewName";
}
#endregion
}
}
Assembly: ENV
References: AdvanceFeatures (Compiled DLL)
Contents of only class SomeEnvClass:
namespace ENV
{
public class SomeEnvClass : AdvanceFeatures.IEnvClass
{
public string Name { get; set; }
private readonly AdvanceFeatures.IDecorator _decorator;
public SomeEnvClass(string name)
{
Name = name;
_decorator = new AdvanceFeatures.Decorator(this);
_decorator.Decorate();
}
public string Foo()
{
return Name;
}
}
}
Assembly: TestBase
References: ENV (compiled DLL)
Contents of only class SomeEnvExtendingClass:
namespace TestBase
{
public class SomeEnvExtandingClass : ENV.SomeEnvClass
{
public SomeEnvExtandingClass(string name) : base(name)
{
}
}
}
Я получаю ошибку:
Ошибка 1 Тип 'AdvanceFeatures.IEnvClass' определен в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку «AdvanceFeatures, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль». E: \ Projects \ Dev \ TestReferenceInheritance \ TestBase \ SomeEnvExtandingClass.cs 3 18 TestBase
Теперь я знаю, почему DLL должна быть доступна для скомпилированного исполняемого файла, но почему разработчик должен знать внутреннюю работу ENV (точнее, это дерево наследования) для его расширения?