【发布时间】:2009-01-23 16:36:12
【问题描述】:
我试图清理代码中的一些可访问性内容,但无意中破坏了 Unity 依赖注入。过了一会儿,我意识到我标记了一些我不想在我的 DLL 之外暴露给内部的公共属性。然后我开始收到异常。
所以在 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 仍然不会设置内部属性
【问题讨论】:
-
通过创建自定义扩展找到了解决方案。请看下面我的回答...
标签: .net unity-container