Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 记录器使用的存储提供程序类中的依赖项注入_C#_Logging_Dependency Injection_Ninject - Fatal编程技术网

C# 记录器使用的存储提供程序类中的依赖项注入

C# 记录器使用的存储提供程序类中的依赖项注入,c#,logging,dependency-injection,ninject,C#,Logging,Dependency Injection,Ninject,我正在编写我的自定义日志并注入一个日志存储。我需要记录对此存储的请求。问题在于,这将是记录器和存储器之间的循环引用。在这种情况下,是否有办法提供松耦合 Smth是这样的: public interface ILogger{ void Log(String msg); } public interface IStorage{ void Save(String msg); } public class MyLogger:ILogger{ private IStorage

我正在编写我的自定义日志并注入一个日志存储。我需要记录对此存储的请求。问题在于,这将是记录器和存储器之间的循环引用。在这种情况下,是否有办法提供松耦合

Smth是这样的:

public interface ILogger{
    void Log(String msg);
}

public interface IStorage{
    void Save(String msg);
}

public class MyLogger:ILogger{

    private IStorage _storage;

    public MyLogger(IStorage storage){
        _storage = storage;
    }

    public void Log(String msg){
        _storage.Save(msg);
    }
}

public class MyStorage:IStorage{

    private ILogger _log;

    public MyStorage(ILogger logger){
        _log = logger
    }

    public void Save(String msg){
        _log.Log(msg);
        //....
        //send msg to a database like SQL, MongoDB, Cassandra or anything
    }

}

public class MyNinjectModule : NinjectModule
{
    public override void Load() 
    {
        Kernel.Bind<ILogger>().To<MyLogger>();
        Kernel.Bind<IStorage>().To<MyStorage>();
    }
}

你可以通过财产注入来解决这个问题,但是你希望它如何工作呢?调用IStorage.Save或ILogger.Log将由于循环调用而导致StackOverflowException崩溃。属性注入没有帮助-我尝试过。和btw属性在ctor之后初始化。这正是问题所在——如果您可以删除其中一个类中的构造函数依赖关系,我不知道谁来解决此designProperty注入中的循环引用。但是StackOverflowException是肯定的。我不确定我是否理解你为什么这么做?您有一个存储类来持久化日志消息,但它不仅存储消息,而且还会再次记录日志?你失去了我。