コード内のいくつかのアクセシビリティ関連のものをクリーンアップしようとしていたところ、Unity の依存性注入がうっかり壊れてしまいました。しばらくして、実際には DLL の外部に公開したくないいくつかのパブリック プロパティを internal にマークしたことに気付きました。その後、例外が発生し始めました。
したがって、Unity で [Dependency] 属性を使用すると、パブリック プロパティに対してのみ機能するようです。Unity アセンブリには内部およびプライベートの props が表示されないため、これは理にかなっていると思いますが、Unity以外の誰も設定したくない、または設定できないようにしたくないパブリックプロパティがたくさんあるのは本当に汚いと感じます。
Unity に内部プロパティまたはプライベート プロパティも設定させる方法はありますか?
ここに合格したい単体テストがあります。現在、public 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
{
}
更新しました:
渡されたプロパティを設定するコールスタックに気付きました:
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 はまだ内部プロパティを設定しません