我试图清理代码中的一些可访问性内容,无意中破坏了 Unity 依赖注入。一段时间后,我意识到我标记了一些我并不真正希望在 DLL 外部暴露给内部的公共属性。然后我开始遇到异常。
所以看来在Unity中使用[Dependency]属性只适用于公共属性。我认为这是有道理的,因为 Unity 程序集看不到内部和私有道具,但是感觉真的很脏拥有一堆公共财产never希望除 Unity 之外的任何人都可以设置或能够设置。
有没有办法让 Unity 也设置内部或私有属性?
这是我希望看到通过的单元测试。目前只有公共 prop 测试通过:
[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
{
}
Updated:
我注意到用于设置传递的属性的调用堆栈:
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 仍然不会设置内部属性