.net - Unity 框架 DependencyAttribute 仅适用于公共(public)属性?

标签 .net unity-container

我试图在我的代码中清理一些可访问性的东西,并且无意中破坏了 Unity 依赖注入(inject)。过了一会儿,我意识到我标记了一些我不想在我的 DLL 之外暴露给内部的公共(public)属性。然后我开始遇到异常。

因此,似乎在 Unity 中使用 [Dependency] 属性仅适用于公共(public)属性。我认为这是有道理的,因为内部和私有(private) Prop 对 Unity 程序集不可见,但是拥有一堆你永远不希望任何人设置或能够设置的公共(public)属性感觉真的很脏,除了 Unity。

有没有办法让统一设置内部或私有(private)属性?

这是我希望通过的单元测试。目前只有公共(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 仍然不会设置内部属性

最佳答案

另一种解决方案是在将依赖项传递给类的方法上使用 [InjectionMethod]。

public class MyClass {
private ILogger logger;

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

...ETC

并称它为:
container.BuildUp<MyClass>(instanceOfMyClass);

它将使用来自统一的依赖关系调用 Init。

没有完全解决问题,我知道...但是

:-) Ĵ

关于.net - Unity 框架 DependencyAttribute 仅适用于公共(public)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/473575/

相关文章:

c# - VSTO:无法创建工作簿

c# - 使用 web.config 进行 Unity 配置

c# - 异常(exception)是 : InvalidOperationException - The current type, 是一个接口(interface),无法构造。您是否缺少类型映射?

dependency-injection - 统一: Replace registered type with another type at runtime

c# - 如何以跨平台方式使用 .NET 5 获取硬件信息?

.net - 如何在保留书签的同时向现有 pdf 添加附加页面? (PDFSharp 等)

c# - 温莎城堡拦截机

C# 控制跨多个数据库的事务

asp.net-mvc-2 - 在 MVC 中使用带有抽象基础 Controller 的 Unity 2 InjectionProperty

entity-framework - Unity 的 PerResolveLifetimeManager,用于存储库、工作单元和 Entity Framework DBContext