我試圖清理我的代碼中的一些可訪問性的東西,並無意中破壞了Unity依賴注入。過了一段時間,我意識到我標記了一些公共屬性,我並不是真的想在我的DLL之外暴露給內部。然後我開始接受例外。Unity框架DependencyAttribute只適用於公共屬性?
因此,在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仍然不會設置內部屬性
通過創建自定義擴展找到解決方案。看到我的答案在下面... – CodingWithSpike 2009-01-23 18:51:53