Я пытался очистить некоторые элементы доступности в моем коде и случайно сломал внедрение зависимостей Unity. Через некоторое время я понял, что пометил некоторые общедоступные свойства, которые на самом деле я не хотел, чтобы их внутренние библиотеки были доступны для внутреннего использования. Затем я начал получать исключения.
Так что кажется, что использование атрибута [Dependency] в Unity работает только для открытых свойств. Я полагаю, что это имеет смысл, поскольку внутренний и закрытый реквизиты не будут видны сборке Unity, но чувствует себя очень грязно , чтобы иметь кучу открытых свойств, которые вы никогда не хотите, чтобы кто-то устанавливал или быть в состоянии установить, кроме Unity.
Есть ли способ позволить единице установить внутренние или частные свойства?
Вот модульный тест, который я хотел бы видеть пройденным. В настоящее время проходит только публичный тест:
[TestFixture]
public class UnityFixture
{
[Test]
public void UnityCanSetPublicDependency()
{
UnityContainer container = new UnityContainer();
container.RegisterType<HasPublicDep, HasPublicDep>();
container.RegisterType<TheDep, TheDep>();
var i = container.Resolve<HasPublicDep>();
Assert.IsNotNull(i);
Assert.IsNotNull(i.dep);
}
[Test]
public void UnityCanSetInternalDependency()
{
UnityContainer container = new UnityContainer();
container.RegisterType<HasInternalDep, HasInternalDep>();
container.RegisterType<TheDep, TheDep>();
var i = container.Resolve<HasInternalDep>();
Assert.IsNotNull(i);
Assert.IsNotNull(i.dep);
}
[Test]
public void UnityCanSetPrivateDependency()
{
UnityContainer container = new UnityContainer();
container.RegisterType<HasPrivateDep, HasPrivateDep>();
container.RegisterType<TheDep, TheDep>();
var i = container.Resolve<HasPrivateDep>();
Assert.IsNotNull(i);
Assert.IsNotNull(i.depExposed);
}
}
public class HasPublicDep
{
[Dependency]
public TheDep dep { get; set; }
}
public class HasInternalDep
{
[Dependency]
internal TheDep dep { get; set; }
}
public class HasPrivateDep
{
[Dependency]
private TheDep dep { get; set; }
public TheDep depExposed
{
get { return this.dep; }
}
}
public class TheDep
{
}
Обновлен:
Я заметил стек вызовов для установки свойства, передаваемого из:
UnityCanSetPublicDependency()
--> Microsoft.Practices.Unity.dll
--> Microsoft.Practices.ObjectBuilder2.dll
--> HasPublicDep.TheDep.set()
Итак, пытаясь хотя бы заставить работать внутреннюю версию, я добавил их в свойства моей сборки:
[assembly: InternalsVisibleTo("Microsoft.Practices.Unity")]
[assembly: InternalsVisibleTo("Microsoft.Practices.Unity.Configuration")]
[assembly: InternalsVisibleTo("Microsoft.Practices.ObjectBuilder2")]
Однако без изменений. Unity / ObjectBuilder по-прежнему не будет устанавливать внутреннее свойство