【问题标题】:Dependence injection into generic class依赖注入到泛型类
【发布时间】:2013-02-05 04:36:20
【问题描述】:

我有泛型 Result<T> 泛型类,我经常在方法中使用它来返回这样的结果

public Result<User> ValidateUser(string email, string password)

Result 类中有 ILoggingService 接口用于记录服务注入,但我没有找到注入实际实现的方法。

我尝试执行下面的代码,但 TestLoggingService 实例未注入到 LoggingService 属性中。它总是返回 null。任何想法如何解决它?

 using (var kernel = new StandardKernel())
            {               
                kernel.Bind<ILoggingService>().To<TestLoggingService>();
                var resultClass = new ResultClass();
                var exception = new Exception("Test exception");
                var testResult = new Result<ResultClass>(exception, "Testing exception", true);                
            }  


      public class Result<T>
        {

           [Inject]
           public ILoggingService LoggingService{ private get; set; } //Always get null


            protected T result = default(T);
            //Code skipped




            private void WriteToLog(string messageToLog, object resultToLog, Exception exceptionToLog)
            {

                LoggingService.Log(....); //Exception here, reference is null



        }

【问题讨论】:

    标签: c#-4.0 dependency-injection ninject


    【解决方案1】:

    您正在使用new 手动创建实例。 Ninject 只会注入由kernel.Get() 创建的对象。此外,您似乎尝试将某些东西注入不推荐的 DTO。最好在创建结果的类中进行日志记录:

    public class MyService
    {
        public MyService(ILoggingService loggingService) { ... }
    
        public Result<T> CalculateResult<T>() 
        {
            Result<T> result = ...
            _loggingService.Log( ... );
            return result;
        }
    }
    

    【讨论】:

    • ResolutionExtensions.Get 在这种情况下可以帮助我吗?我在任何地方都找不到关于 ResolutionExtensions 中方法的描述。
    • +1 @Tomas 阅读并相信答案 - Remo 在他的建议中是正确的。你引用的方法最好被认为等同于Kernel.Get()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多