RegisterSingleton传构造参数、跨项目共享配置及单例服务互通问题咨询
问题1:注册CustomerService时传入连接字符串及连接字符串共享方案
1.1 注册时直接传入构造参数
你可以使用RegisterSingleton的工厂方法重载,直接读取主项目App.config的连接字符串传入构造函数,示例代码如下:
using System.Configuration; public void RegisterTypes(IContainerRegistry containerRegistry) { // 读取主项目App.config中的连接字符串,替换为你自己的配置节点名 string mySqlConnStr = ConfigurationManager.ConnectionStrings["MySQLConnection"].ConnectionString; // 用工厂方法重载注册,手动传入构造参数 containerRegistry.RegisterSingleton<ICustomerService>(serviceProvider => { return new CustomerService(mySqlConnStr); }); }
1.2 多DLL服务共享连接字符串的推荐方案
如果连接字符串需要被多个服务使用,更易维护的方案是用选项模式统一管理配置,避免每个服务都手动传参:
- 定义通用配置类(可放到公共共享项目中,供所有DLL引用)
public class MySQLDbSettings { public string ConnectionString { get; set; } }
- 主项目注册配置实例为单例
public void RegisterTypes(IContainerRegistry containerRegistry) { var connStr = ConfigurationManager.ConnectionStrings["MySQLConnection"].ConnectionString; // 注册配置实例,所有服务都可以注入这个实例获取连接字符串 containerRegistry.RegisterInstance(new MySQLDbSettings { ConnectionString = connStr }); // 后续注册服务不需要手动传参,容器会自动注入配置 containerRegistry.RegisterSingleton<ICustomerService, CustomerService>(); containerRegistry.RegisterSingleton<IItemService, ItemService>(); }
- 调整DLL中服务的构造函数,注入配置实例
public class CustomerService : ICustomerService { private readonly string _mySQLConnectionString; // 容器自动注入注册好的MySQLDbSettings实例 public CustomerService(MySQLDbSettings dbSettings) { _mySQLConnectionString = dbSettings.ConnectionString; } // 其余业务代码不变 }
问题2:注册SocketService供其他单例服务调用
你只需要先将SocketService注册为单例,其余服务直接在构造函数中声明依赖即可,容器会自动将同一个SocketService单例注入到所有依赖它的服务中:
- 注册SocketService
public void RegisterTypes(IContainerRegistry containerRegistry) { // 如果有对应接口就注册接口和实现的单例 containerRegistry.RegisterSingleton<ISocketService, SocketService>(); // 如果没有定义接口,直接注册本身的单例即可 // containerRegistry.RegisterSingleton<SocketService>(); // 其余服务注册不需要改动,只要构造函数声明依赖即可 containerRegistry.RegisterSingleton<ICustomerService, CustomerService>(); }
- 在需要调用的服务中注入SocketService
public class CustomerService : ICustomerService { private readonly ISocketService _socketService; private readonly string _connStr; public CustomerService(MySQLDbSettings dbSettings, ISocketService socketService) { _connStr = dbSettings.ConnectionString; _socketService = socketService; // 可以选择在构造时调用Connect,也可以在业务方法中按需调用 // _socketService.Connect(); } public List<Customer> GetCustomerList() { // 业务逻辑中直接调用SocketService的方法即可 // _socketService.Send(xxx); return new List<Customer>(); } }
注意:如果
Connect()方法是全局只需要调用一次的初始化逻辑,你可以在所有服务注册完成后,手动从容器中解析出SocketService实例调用一次即可,避免重复初始化。
内容的提问来源于stack exchange,提问作者Buruhazard
相关产品推荐
相关产品推荐

