如何在洋葱架构应用程序中将连接字符串传递给 DBContext?

How to pass connection string to DBContext in Onion architecture application?

这是一个标准的洋葱架构 MVC 应用程序,具有服务和存储库层。应用程序需要从遗留组件(外部文件源)读取连接字符串并传递给 DBContext。

如何将此连接字符串传递给 Repository 或 DBContext,以便它可以传递给 DBContext 构造函数?

public class TSService : ITSService
{
       public TSService (ITSRepository tsRepository)
        {
        }
}
public class TSRepository : ITSRepository
{
        private IContext _context;
        public TSRepository (IContext context)
        {
            _ context = context;
        }

        public Employee GetEmployee(string employeeNumber)
        {
        }
}

不确定传递连接字符串是什么意思。连接字符串应按名称引用,按照约定或在上下文定义中手动指定:

public class ApplicationDbContext
{
    public ApplicationDbContext()
        : base("ConnectionStringName")
    {
    }
}

然后,您使用该名称在 Web.config 中定义连接字符串。

你的其他一切看起来都很好。您正在将上下文注入您的存储库,并将您的存储库注入您的服务。我会说这 似乎 有点矫枉过正。一般来说,你应该只有服务或存储库,三级依赖似乎有点多。但是,在不了解您的应用程序的情况下,我不能肯定地说它是 "wrong";我只是鼓励您评估您是否真的需要这么多抽象。上下文可以简单地注入到服务中并称之为 day 吗?

How do I pass this connection string to Repository or DBContext so that it can be passed to DBContext constructor?

您可以通过在启动期间(在您的 Composition Root 中)从配置文件中读取连接字符串来执行此操作,这与您调用 DBContext 的构造函数的位置相同。

示例:

string conStr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;

container.Register<DBContext>(() => new DBContext(conStr));

只需创建一个像 ISettingService 这样的核心服务接口,它具有从某处获取连接字符串的方法,并在基础结构层中实现它。

将其传递到您的存储库,然后传递到您的存储库正在使用的 IContext 接口。您的存储库应该将两者连接起来。

可能像这里显示的那样:https://dotnetfiddle.net/rtQ81E