我最近启动了一个小型项目(C#.Net控制台应用程序),并试图将Castle Windsor作为我的DI容器正确使用依赖注入。通过ORM将新记录添加到数据库时应该如何使用依赖注入? C#
因为我已经进行了一段时间的单元测试,所以对于依赖注入我不是什么新东西。我觉得我一直在行,但遇到了一个场景,我觉得我必须实例化一个远离组合根的对象。
在我的数据访问层,我使用实体框架(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; }
}
这是我过去使用过的解决方案,因为可以对这段代码进行单元测试,但我不再注入所有的依赖关系。
我已经考虑过方法注入(即传递一个ILog与消息),但是消耗此代码的类从哪里得到它的实例呢?如果我要注入一个工厂,同样的问题也是如此,它会从这个类中解决问题并将其移至另一个类。
我怀疑解决方案(如果需要的话)在于我如何设置ILog实例的对象生存期。
在我真正的实现中,我有一个Controller类,需要一个ILogger的实例。我可以用我的DI容器注册Controller,ILogger和IContext的具体实现,我可以解析Controller的一个实例并运行该应用程序,但在运行时我需要未知数量的Log实例。
如何将创建的Log实例推回到我的DI容器中?这是我应该试图做的事吗?
为什么'Log'需要一个接口'ILog'? Log不是一个简单的DTO吗?你能想到一个场景,你需要一个不同的'ILog'实现吗? –
为什么要创建多个Log实例?不应该使用Singleton? – Rohit
雅各布马萨德 - 我知道有人会指出。答案可能是?我们的数据库正在经历一些重大变化。我已经知道如何将自己映射到几个不同的表,但这些表可能会改变。 –