当通过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容器?这是我应该做的吗?
一般来说,这里不需要DI。DI并不意味着你不能使用"new"操作符。是的,你可以,域类是一个很好的例子,你会使用它。
但是如果有一些复杂的场景,你想在Log实例上抽象创建,你总是可以使用工厂模式:
public interface ILogFactory
{
ILog Create();
}
public class DefaultLogFactory : ILogFactory
{
public ILog Create()
{
return new Log();
}
}
这个工厂现在是可注入和可交换的。但就像我说的,你可能不需要或不想要那个