2016-09-14 15 views
0

我最近启动了一个小型项目(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容器中?这是我应该试图做的事吗?

+2

为什么'Log'需要一个接口'ILog'? Log不是一个简单的DTO吗?你能想到一个场景,你需要一个不同的'ILog'实现吗? –

+0

为什么要创建多个Log实例?不应该使用Singleton? – Rohit

+0

雅各布马萨德 - 我知道有人会指出。答案可能是?我们的数据库正在经历一些重大变化。我已经知道如何将自己映射到几个不同的表,但这些表可能会改变。 –

回答

-1

一般来说 - 你不应该在这里需要一个DI。 DI并不意味着你根本不能使用'新'操作符。是的,你可以和域的类是非常好的例子,你会使用它。

但如果你想在登录实例抽象创作一些复杂的情况下,您可以随时使用工厂模式:

public interface ILogFactory 
{ 
    ILog Create(); 
} 

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

这家工厂现在注射和更换。但就像我说的,你可能不需要或不需要那样。

+0

在我的问题我确实说过我考虑过工厂模式,但是避免了它,因为它只是简单地解决了问题。现在你的工厂正在创建新的实例,而不是原来的类。重点是什么? –

+0

您可以在配置中轻松交换工厂。但正如我所说 - 你可能根本就不需要任何抽象! –

相关问题