如何配置Unity容器为类传入字符串值完成注册(ASP.NET MVC5场景)
解决Unity.Mvc注册带构造参数的MainContext问题
你可以通过Unity的InjectionConstructor来指定构造函数的参数值,同时建议为MainContext配置每请求生命周期,避免DbContext实例复用带来的问题。以下是具体步骤:
1. 基本注册方式(直接指定连接名)
在你的Unity配置类(通常是App_Start/UnityConfig.cs)的RegisterComponents方法中,添加以下注册代码:
using Microsoft.Practices.Unity; using System.Data.Entity; public static class UnityConfig { public static void RegisterComponents() { var container = new UnityContainer(); // 注册MainContext,传入生产环境连接名"DefaultConnection" container.RegisterType<MainContext>( new PerRequestLifetimeManager(), // 每个请求创建一个实例,用完自动释放 new InjectionConstructor("DefaultConnection") // 指定构造函数参数 ); // 注册其他服务... // 将Unity设置为MVC的依赖解析器 DependencyResolver.SetResolver(new UnityDependencyResolver(container)); } }
2. 从配置文件读取连接名(更灵活)
如果后续需要切换环境,你也可以从Web.config的配置项中读取连接名,比如:
using System.Configuration; // 从AppSettings读取连接名(或者直接用ConnectionStrings的名称) var connectionName = ConfigurationManager.AppSettings["ProductionDbConnectionName"] ?? "DefaultConnection"; // 兜底值 container.RegisterType<MainContext>( new PerRequestLifetimeManager(), new InjectionConstructor(connectionName) );
3. 验证注入是否生效
在你的MVC控制器中,通过构造函数注入MainContext,Unity会自动创建传入指定连接名的实例:
public class UserController : Controller { private readonly MainContext _dbContext; // 构造函数注入 public UserController(MainContext dbContext) { _dbContext = dbContext; } public ActionResult Index() { var users = _dbContext.Users.ToList(); return View(users); } }
关键说明
- 生命周期选择:
PerRequestLifetimeManager确保每个HTTP请求对应一个MainContext实例,既符合DbContext的轻量级设计,又能避免内存泄漏和数据上下文混乱的问题。 - 构造函数指定:
InjectionConstructor明确告诉Unity使用带字符串参数的构造函数创建实例,避免Unity自动选择构造函数时出现歧义(比如如果有多个构造函数的话)。
内容的提问来源于stack exchange,提问作者Junior
相关产品推荐
相关产品推荐

