Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在通过ORM向数据库添加新记录时,我应该使用依赖项注入吗?如果应该,如何使用?C#_C#_.net_Dependency Injection_Castle Windsor - Fatal编程技术网

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

在通过ORM向数据库添加新记录时,我应该使用依赖项注入吗?如果应该,如何使用?C#,c#,.net,dependency-injection,castle-windsor,C#,.net,Dependency Injection,Castle Windsor,我最近启动了一个小项目(C#.Net控制台应用程序),我正试图“正确地”使用Castle Windsor作为我的DI容器的依赖项注入 我对依赖注入并不完全陌生,因为我已经进行了一段时间的单元测试。我觉得到目前为止我做得还不错,但是遇到了一个场景,我觉得我必须实例化一个远离合成根的对象 在我的数据访问层中,我使用实体框架(6)从数据库中获取数据。这些都隐藏在我的域逻辑层中定义的接口后面 我需要添加一个新的日志记录,这里是我的代码的节略和编辑版本 public class Logger:ILogge

我最近启动了一个小项目(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; }
}
这是我过去使用过的解决方案,因为可以对代码进行单元测试,但我不再注入所有依赖项

我考虑过方法注入(即,将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
实现,并进一步说明它是如何映射到不同的表的?在我的问题中,我确实指出我考虑过工厂模式,但避免了它,因为它只是解决了问题。现在,您的工厂正在创建新实例,而不是原始类。重点是什么?您可以在配置中轻松地交换工厂。但是就像我说的,你可能根本不需要任何抽象!