C# 当依赖项无法实例化时如何调试?

C# 当依赖项无法实例化时如何调试?,c#,debugging,dependency-injection,unity-container,C#,Debugging,Dependency Injection,Unity Container,当依赖项没有实例化时,如何调试依赖项注入(使用Unity DI) 例如,给定一个具有依赖项的服务类: public class FooService : IFooService { [Dependency] public BarService BarService { get; set; } [Dependency] public AnotherService AnotherService { get; set; } // other code fail

当依赖项没有实例化时,如何调试依赖项注入(使用Unity DI)

例如,给定一个具有依赖项的服务类:

public class FooService : IFooService
{
    [Dependency]
    public BarService BarService { get; set; }
    [Dependency]
    public AnotherService AnotherService { get; set; }

    // other code fails because BarService and AnotherService are null
}
在Global.asax.cs中

private void ConfigureIoC()
{
    container
        .ConfigureAutoRegistration()
        .LoadAssembliesFrom(assemblyPaths)
        .ExcludeSystemAssemblies()
        .Include(If.Any, Then.Register()) 
        .ApplyAutoRegistration();

    var serviceLocator = new UnityServiceLocator(container);
    ServiceLocator.SetLocatorProvider(() => serviceLocator);
}
IFooService也由Unity实例化,但它使用构造函数注入(并且可以工作):


我如何调试它以了解依赖项无法实例化的原因。没有抛出异常(或者如果抛出异常,那么Elmah不会捕获并记录它们)

调用
container.Resolve()


IFooService的解析在哪里/如何进行?

调用
container.Resolve()


IFooService的解析在何处/如何进行?

不注入依赖项,因为
DependencyAttribute
位于具体类而不是接口上

作为DI属性,我建议您将注册更改为

container.RegisterType<IFooService,FooService>(new InjectionProperty("BarService"), new InjectionProperty("AnotherService"));
container.RegisterType(新InjectionProperty(“BarService”)、新InjectionProperty(“AnotherService”);

解析
IFooService
将返回带有注入依赖项的
FooService
实例。

不注入依赖项,因为
DependencyAttribute
位于具体类而不是接口上

作为DI属性,我建议您将注册更改为

container.RegisterType<IFooService,FooService>(new InjectionProperty("BarService"), new InjectionProperty("AnotherService"));
container.RegisterType(新InjectionProperty(“BarService”)、新InjectionProperty(“AnotherService”);


解析
IFooService
将返回带有注入依赖项的
FooService
实例。

请避免在问题标题中包含诸如_C#、调试、统一、依赖项注入等内容。这就是标签的作用。在这种情况下,我通常会将我的代码单元与Unity的源项目链接,然后我会逐步浏览Unity代码,以查看如何解决这些问题。请避免在问题标题中包含诸如_C 35;、调试、Unity、依赖项注入等内容。这就是标签的作用。在这种情况下,我通常会将我的代码单元与Unity的源项目链接起来,然后我逐步浏览Unity代码,看看这些问题是如何解决的。我更新了问题以显示FooService是如何实例化的,这一部分是有效的。对Unity和setter注入有更多了解的人可能必须回答这个问题(我有一段时间没有使用它了),但我会尝试暂时使依赖项都是构造函数注入的,只是看看它们是否解决了。如果没有,错误应该告诉你原因。如果他们这样做了,那么一定是你如何设置setter注入。我更新了这个问题,以展示FooService是如何实例化的,这部分是如何工作的。了解Unity和setter注入的人可能必须回答这个问题(我有一段时间没有使用过它),但我会尝试暂时将依赖项全部注入构造函数,只是看看他们是否解决了。如果没有,错误应该告诉你原因。如果他们这样做了,那一定是设置setter注入的方式。更好的建议是使用构造函数注入而不是属性注入。@Steven取决于这些依赖项是“必须拥有”(构造函数注入)还是“很好拥有”(属性注入)依赖关系您完全正确。我必须说,当显式地用[Dependency]属性修饰的属性不能被注入时,Unity不会失败,这让我有点眼花缭乱。无声地失败会使配置更加脆弱。@Steven它并没有失败,它正是在做你要求的事情。“给我一个IFooService”。确实如此。如果您请求
FooService
,它将填充属性。但是接口没有告诉Unity注入任何东西。不,Unity将填充显式修饰的属性,但只有在注册这些类型的情况下。否则它会悄悄地跳过它们,这在大多数情况下不是您想要的,因为这意味着您无法轻松验证DI配置的正确性。更好的建议是使用构造函数注入而不是属性注入。@Steven取决于这些依赖项是否“必须具有”(构造函数注入)或“很好拥有”(属性注入)依赖项您绝对是对的。我必须说,当一个属性显式地用[Dependency]修饰时,Unity并没有失败,这让我有点眼花缭乱无法注入属性。默认失败会使配置更加脆弱。@Steven它没有失败,它正按照您的要求执行。“给我一个IFooService”。确实如此。如果您请求一个
FooService
,它将填充属性。但是接口没有告诉Unity注入任何内容。不,Unity将填充显式修饰的属性,但前提是这些类型已注册。否则,它将默默地跳过它们,这在大多数情况下不是您想要的,因为这意味着您无法轻松验证DI配置的正确性。