Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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
C# 如果构造函数使用另一个接口,如何在简单的注入器中进行构造函数注入?_C#_Dependency Injection_Simple Injector - Fatal编程技术网

C# 如果构造函数使用另一个接口,如何在简单的注入器中进行构造函数注入?

C# 如果构造函数使用另一个接口,如何在简单的注入器中进行构造函数注入?,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,我试图实例化HomedataAccess类,该类将字符串和接口IQueryManager作为构造函数参数。如何注册 到目前为止,我已经完成了以下工作,但我不喜欢这种方式: Kernel.Register(() => new HomeDataAccess("anandv4", new SqlServerQueryManager(new SqlServerConnectionManager()))); 还有其他方法吗?你正在做的事情可以很好地完成。这没什么错。尤其是当您的Sql

我试图实例化
HomedataAccess
类,该类将字符串和接口
IQueryManager
作为构造函数参数。如何注册

到目前为止,我已经完成了以下工作,但我不喜欢这种方式:

 Kernel.Register(() => new HomeDataAccess("anandv4", 
     new SqlServerQueryManager(new SqlServerConnectionManager())));

还有其他方法吗?

你正在做的事情可以很好地完成。这没什么错。尤其是当您的
SqlServerQueryManager
SqlServerConnectionManager
仅在
HomeDataAccess
类中使用时

但是,如果在多个位置使用了
IQueryManager
抽象,则问题会更大,因为它会导致注册重复,这可能会增加维护

解决方案可能是执行以下操作:

Kernel.Register(() => new HomeDataAccess(
    "anandv4",
    Kernel.GetInstance<IQueryManager>());
这允许您按如下方式进行注册:

Kernel.RegisterSingleton(new HomeDataAccessConfig("anandv4"));
Kernel.Register<HomeDataAccess>();
Kernel.Register<IQueryManager>(() =>
     new SqlServerQueryManager(new SqlServerConnectionManager()));
Kernel.RegisterSingleton(新的HomeDataAccessConfig(“anandv4”);
Register();
内核寄存器(()=>
新的SqlServerQueryManager(新的SqlServerConnectionManager());

感谢您详细介绍。我发现我可以将简单的username属性抽象为单独的IUser接口。这有助于执行以下操作:Kernel.Register();Register();Register();在运行的应用程序的生命周期中,用户名是常量还是每个请求都会更改(如:触发当前请求的用户的名称)
Kernel.RegisterSingleton(new HomeDataAccessConfig("anandv4"));
Kernel.Register<HomeDataAccess>();
Kernel.Register<IQueryManager>(() =>
     new SqlServerQueryManager(new SqlServerConnectionManager()));