我试图在我的代码中清理一些可访问性的东西,并且无意中破坏了 Unity 依赖注入。过了一会儿,我意识到我标记了一些我不想在我的 DLL 之外暴露给内部的公共属性。然后我开始遇到异常。
因此,似乎在 Unity 中使用 [Dependency] 属性仅适用于公共属性。我认为这是有道理的,因为内部和私有道具对 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 仍然不会设置内部属性