Dot-Net

Unity 框架 DependencyAttribute 僅適用於公共屬性?

  • September 2, 2015

我試圖在我的程式碼中清理一些可訪問性的東西,並且無意中破壞了 Unity 依賴注入。過了一會兒,我意識到我標記了一些我不想在我的 DLL 之外暴露給內部的公共屬性。然後我開始遇到異常。

所以似乎使用

$$ 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 仍然不會設置內部屬性

另一種解決方案是使用

$$ InjectionMethod $$在將依賴項傳遞給類的方法上。

public class MyClass {
private ILogger logger;

[InjectionMethod]
public void Init([Dependency] ILogger logger)
{
   this.logger = logger;

…ETC


並稱它為:

container.BuildUp<MyClass>(instanceOfMyClass);

它將使用來自統一的依賴關係呼叫 Init。

沒有完全解決問題,我知道…但是

:-) Ĵ

如果屬性是 get-only,則使用建構子注入而不是屬性注入更有意義。

如果 Unity確實使用反射來設置私有或內部成員,它將受到程式碼訪問安全約束。具體來說,它不會在低信任環境中工作。

引用自:https://stackoverflow.com/questions/473575