在通过ORM向数据库添加新记录时,我应该使用依赖项注入吗?如果应该,如何使用?C#
我最近启动了一个小项目(C#.Net控制台应用程序),我正试图“正确地”使用Castle Windsor作为我的DI容器的依赖项注入 我对依赖注入并不完全陌生,因为我已经进行了一段时间的单元测试。我觉得到目前为止我做得还不错,但是遇到了一个场景,我觉得我必须实例化一个远离合成根的对象 在我的数据访问层中,我使用实体框架(6)从数据库中获取数据。这些都隐藏在我的域逻辑层中定义的接口后面 我需要添加一个新的日志记录,这里是我的代码的节略和编辑版本在通过ORM向数据库添加新记录时,我应该使用依赖项注入吗?如果应该,如何使用?C#,c#,.net,dependency-injection,castle-windsor,C#,.net,Dependency Injection,Castle Windsor,我最近启动了一个小项目(C#.Net控制台应用程序),我正试图“正确地”使用Castle Windsor作为我的DI容器的依赖项注入 我对依赖注入并不完全陌生,因为我已经进行了一段时间的单元测试。我觉得到目前为止我做得还不错,但是遇到了一个场景,我觉得我必须实例化一个远离合成根的对象 在我的数据访问层中,我使用实体框架(6)从数据库中获取数据。这些都隐藏在我的域逻辑层中定义的接口后面 我需要添加一个新的日志记录,这里是我的代码的节略和编辑版本 public class Logger:ILogge
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; }
}
这是我过去使用过的解决方案,因为可以对代码进行单元测试,但我不再注入所有依赖项
我考虑过方法注入(即,将ILog与消息一起传递),但是使用此代码的类从何处获取其实例?如果我要注入一个工厂,同样的问题也是正确的,它会将问题从这个类中移除,并将其转移到另一个类中
我怀疑解决方案(如果需要的话)在于如何设置ILog实例的对象生存期
在我的实际实现中,我有一个控制器类,它接受一个ILogger实例。我可以用我的DI容器注册控制器、ILogger和IContext的具体实现,我可以解析控制器实例并运行应用程序,但在运行时我需要未知数量的日志实例
如何将日志实例的创建推回到DI容器中?这是我应该尝试做的吗?一般来说,这里不需要DI。DI并不意味着你根本不能使用“new”操作符。是的,您可以,域类是您将使用它的非常好的示例 但如果有一些复杂的场景需要在日志实例上抽象创建,则始终可以使用factory模式:
public interface ILogFactory
{
ILog Create();
}
public class DefaultLogFactory : ILogFactory
{
public ILog Create()
{
return new Log();
}
}
这家工厂现在可以注射和交换。但是就像我说的,你可能不需要或者不想要它。为什么
Log
需要一个接口ILog
?Log
不是一个简单的DTO吗?你能想到一个场景吗?你需要一个不同的ILog
实现?为什么要创建多个Log实例?你不应该使用singleton吗?Yacoub Massad-我知道有人会指出这一点。答案可能是,我们的数据库正在经历一些重大的变化。我的日志实现知道如何将自己映射到几个不同的表,但这些表可能会发生变化。Rohit-我认为我需要创建多个实例,因为如果我传入一个实例,当我保存时,它只会不断更新数据库中的相同日志记录,而不是每次使用write方法时都创建新记录called@mark_h,您能否展示当前的Log
实现,并进一步说明它是如何映射到不同的表的?在我的问题中,我确实指出我考虑过工厂模式,但避免了它,因为它只是解决了问题。现在,您的工厂正在创建新实例,而不是原始类。重点是什么?您可以在配置中轻松地交换工厂。但是就像我说的,你可能根本不需要任何抽象!