当通过ORM向数据库添加新记录时,我应该使用依赖注入吗?如果是,如何使用?c#

本文关键字:注入 依赖 如果 何使用 我应该 ORM 数据库 添加 新记录 | 更新日期: 2023-09-27 18:06:52

我最近开始了一个小项目(c# . net控制台应用程序),我正试图"正确地"使用Castle Windsor作为我的DI容器来使用依赖注入。

我对依赖注入并不陌生,因为我已经进行单元测试一段时间了。我觉得到目前为止我一直做得很好,但遇到了一个场景,我觉得我必须实例化一个远离组合根的对象。

在我的数据访问层,我使用实体框架(6)从我的数据库获取数据。这些都隐藏在领域逻辑层中定义的接口后面。

我需要添加一个新的日志记录,这里是我的代码的删节和编辑版本;

public class Logger:ILogger
{
    private readonly IContext _context;
    public Logger(IContext context)
    {
        _context = context;
    }
    public void Write(string message)
    {
        var log = new Log();
        log.Message = message;
        context.Logs.Add(Log);
        context.Save();
    }
}

Log实现ILog接口;

public interface ILog
{
    string Message { get; set; }
}

这是我过去使用过的解决方案,因为可以对这段代码进行单元测试,但我不再注入所有的依赖项。

我已经考虑了方法注入(即通过消息的illog),但是在哪里会消耗这个代码的类得到它的实例?如果我注入一个工厂,同样的问题也是成立的,它把问题从这个类中取出来,转移到另一个类中。

我怀疑解决方案(如果需要的话)在于如何设置ILog实例的对象生存期。

在我的实际实现中,我有一个控制器类,它接受一个ILogger的实例。我可以用我的DI容器注册控制器,ILogger和IContext的具体实现,我可以解析控制器实例并运行应用程序,但在运行时我需要未知数量的日志实例。

我如何将日志实例的创建推回我的DI容器?这是我应该做的吗?

当通过ORM向数据库添加新记录时,我应该使用依赖注入吗?如果是,如何使用?c#

一般来说,这里不需要DI。DI并不意味着你不能使用"new"操作符。是的,你可以,域类是一个很好的例子,你会使用它。

但是如果有一些复杂的场景,你想在Log实例上抽象创建,你总是可以使用工厂模式:

public interface ILogFactory
{
    ILog Create();
}
public class DefaultLogFactory : ILogFactory
{
    public ILog Create()
    {
        return new Log();
    }
}

这个工厂现在是可注入和可交换的。但就像我说的,你可能不需要或不想要那个