Por que preciso fazer referência a uma dll que não estou usando diretamente?
Tenho o código fonte que recebi de um desenvolvedor externo, este código é dividido em 4 tipos de projetos: sua estrutura, o ambiente para o meu projeto (vamos chamá-lo de "ENV"), a base de aplicativos (chamada "Base") e o próprio aplicativo (cerca de 20 dlls, eu vou chamar coletivamente de "aplicativo").
Agora, adicionei outra camada a essa bagunça, uma dll chamada AdvanceFeatures. Está bem abaixo do ENV (no topo da estrutura). Esta dll referencia nada além da estrutura e a ENV faz referência a ela. Somente o ENV faz uso desta DLL AdvanceFeatures, enquanto a Base e o aplicativo usam apenas o ENV.
A maneira como estou trabalhando aqui é que a maioria dos objetos no aplicativo são definidos na Base e herdam / implementam classes / interfaces no ENV. Também uma pequena parte desses objetos (no App e no Base) herda / implementa classes / interfaces da própria estrutura (mas isso é bastante raro
té agora, tudo está bem, exceto por um fato. O compilador exige que eu adicione uma referência à DLL AdvanceFeatures de cada uma das DLLs no App e da Bas
Não uso AdvanceFeatures fora da ENV, por que essas referências são necessárias?
Edit: Eu criei um projeto de demonstração para este problema. Estes são os detalhes do projeto:
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)
{
}
}
}
Eu recebo o erro:
Error 1 O tipo 'AdvanceFeatures.IEnvClass' é definido em um assembly que não é referenciado. Você deve adicionar uma referência ao assembly 'AdvanceFeatures, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'. E: \ Projetos \ Dev \ TestReferenceInheritance \ TestBase \ SomeEnvExtandingClass.cs 3 18 TestBase
Agora, eu sei por que a DLL deve estar disponível para o executável compilado, mas por que o desenvolvedor deve conhecer o funcionamento interno do ENV (mais especificamente, é a árvore de herança) para estendê-l