如何配置asp.net-mvc使用Unity 2.0实现MVC模式下的Web.config?

2026-03-30 13:001阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计756个文字,预计阅读时间需要4分钟。

如何配置asp.net-mvc使用Unity 2.0实现MVC模式下的Web.config?

我正在尝试将Unity 2.0用于我当前的MVC项目,但在web.config文件中无法配置参数注入。我的解决方案包括:

1. 家庭控制器:public class HomeController : Controller { IRepository repository=null; }

如何配置asp.net-mvc使用Unity 2.0实现MVC模式下的Web.config?

我正在尝试将Unity 2.0用于我当前的MVC项目,并且无法在web.config文件中配置参数注入.

这就是我所拥有的:

1)家庭控制器:

public class HomeController : Controller { IRepository repository = null; public HomeController() { // Always calls this constructor. Why? // Should be calling the constructor below that takes IRepository. } public HomeController(IRepository repository) { // Should be calling this constructor!!! this.repository = repository; } public ActionResult Index() { List<int> intList = this.repository.GetInts(); ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); }

一个带两个构造函数的基本控制器.第一个不带参数,第二个带IRepository作为参数(应该由Unity注入)

2)SQL存储库

public class SQLRepository : IRepository { private string connectionString = null; public SQLRepository(string connectionString) { this.connectionString = connectionString; } #region IRepository Members public List<int> GetInts() { return new List<int>() { 1, 2, 3, 4, 5 }; } #endregion }

未来是SQL存储库,但是现在它只实现了IRepository接口的1个成员,即GetInts()并返回一个整数列表.

3)IRepository Interace

public interface IRepository { List<int> GetInts(); }

一个界面.

4)我的Global.asax文件中的Application_Start()事件.

protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); IUnityContainer container = new UnityContainer(); UnityConfigurationSection section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection; section.Configure(container, "Default"); }

这用于从web.config文件中读取Unity 2.0配置,以便注册和映射类型等.

6)web.config中的Unity 2.0配置部分

<unity> <typeAliases> <typeAlias alias="string" type="System.String, mscorlib" /> <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" /> <typeAlias alias="IRepository" type="NewMVCApp.Interfaces.IRepository, NewMVCApp" /> <typeAlias alias="SQLRepository" type="NewMVCApp.Repository.SQLRepository, NewMVCApp" /> </typeAliases> <containers> <container name="Default"> <types> <type type="IRepository" mapTo="SQLRepository"> <lifetime type="singleton" /> <constructor> <param name="connectionString"> <value value="ApplicationServices" /> </param> </constructor> </type> </types> </container> </containers>

这是我使用的Unity 2.0配置部分.正如您所看到的,它为我的IRepository和我的SQLRepository类输入了类型,然后将IRepository映射到SQLRepository.因此,只要请求IRepository,就会提供SQLRepository实例.另外,我想通过构造函数将连接字符串传递给我的SQLRepository.

5)那么,我想做什么?

我试图使用Unity 2.0将IRepository(SQLRepository)的实例传递给我的HomeController.但由于某种原因,HomeController()的默认无参数构造函数被调用.但HomeController(IRepository存储库)永远不会被调用.我很确定我没有在web.config文件中正确设置.但我不确定如何正确设置,以便调用HomeController上的正确构造函数.请帮忙:)

&谢谢你:)

你的Unity配置看起来很好.问题是你没有将Unity连接到MVC框架,所以框架没有使用容器来创建你的控制器,而是MVC使用默认逻辑,它调用默认的构造函数.

你需要两件事.首先,IControllerFactory的实现.我通常使用这个:

public class UnityControllerFactory : DefaultControllerFactory { private readonly IUnityContainer container; public UnityControllerFactory(IUnityContainer container) { this.container = container; } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { if(controllerType != null) return container.Resolve(controllerType) as IController; return base.GetControllerInstance(requestContext, controllerType); } }

其次,你需要告诉MVC框架使用这个控制器工厂而不是它的默认工厂.您可以在Application_Start处理程序中执行此操作.做这个:

ControllerBuilder.Current.SetControllerFactory( new UnityControllerFactory(container));

完成后,您的控制器将通过容器创建,一切都应该开始工作.

标签:Unity2

本文共计756个文字,预计阅读时间需要4分钟。

如何配置asp.net-mvc使用Unity 2.0实现MVC模式下的Web.config?

我正在尝试将Unity 2.0用于我当前的MVC项目,但在web.config文件中无法配置参数注入。我的解决方案包括:

1. 家庭控制器:public class HomeController : Controller { IRepository repository=null; }

如何配置asp.net-mvc使用Unity 2.0实现MVC模式下的Web.config?

我正在尝试将Unity 2.0用于我当前的MVC项目,并且无法在web.config文件中配置参数注入.

这就是我所拥有的:

1)家庭控制器:

public class HomeController : Controller { IRepository repository = null; public HomeController() { // Always calls this constructor. Why? // Should be calling the constructor below that takes IRepository. } public HomeController(IRepository repository) { // Should be calling this constructor!!! this.repository = repository; } public ActionResult Index() { List<int> intList = this.repository.GetInts(); ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); }

一个带两个构造函数的基本控制器.第一个不带参数,第二个带IRepository作为参数(应该由Unity注入)

2)SQL存储库

public class SQLRepository : IRepository { private string connectionString = null; public SQLRepository(string connectionString) { this.connectionString = connectionString; } #region IRepository Members public List<int> GetInts() { return new List<int>() { 1, 2, 3, 4, 5 }; } #endregion }

未来是SQL存储库,但是现在它只实现了IRepository接口的1个成员,即GetInts()并返回一个整数列表.

3)IRepository Interace

public interface IRepository { List<int> GetInts(); }

一个界面.

4)我的Global.asax文件中的Application_Start()事件.

protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); IUnityContainer container = new UnityContainer(); UnityConfigurationSection section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection; section.Configure(container, "Default"); }

这用于从web.config文件中读取Unity 2.0配置,以便注册和映射类型等.

6)web.config中的Unity 2.0配置部分

<unity> <typeAliases> <typeAlias alias="string" type="System.String, mscorlib" /> <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" /> <typeAlias alias="IRepository" type="NewMVCApp.Interfaces.IRepository, NewMVCApp" /> <typeAlias alias="SQLRepository" type="NewMVCApp.Repository.SQLRepository, NewMVCApp" /> </typeAliases> <containers> <container name="Default"> <types> <type type="IRepository" mapTo="SQLRepository"> <lifetime type="singleton" /> <constructor> <param name="connectionString"> <value value="ApplicationServices" /> </param> </constructor> </type> </types> </container> </containers>

这是我使用的Unity 2.0配置部分.正如您所看到的,它为我的IRepository和我的SQLRepository类输入了类型,然后将IRepository映射到SQLRepository.因此,只要请求IRepository,就会提供SQLRepository实例.另外,我想通过构造函数将连接字符串传递给我的SQLRepository.

5)那么,我想做什么?

我试图使用Unity 2.0将IRepository(SQLRepository)的实例传递给我的HomeController.但由于某种原因,HomeController()的默认无参数构造函数被调用.但HomeController(IRepository存储库)永远不会被调用.我很确定我没有在web.config文件中正确设置.但我不确定如何正确设置,以便调用HomeController上的正确构造函数.请帮忙:)

&谢谢你:)

你的Unity配置看起来很好.问题是你没有将Unity连接到MVC框架,所以框架没有使用容器来创建你的控制器,而是MVC使用默认逻辑,它调用默认的构造函数.

你需要两件事.首先,IControllerFactory的实现.我通常使用这个:

public class UnityControllerFactory : DefaultControllerFactory { private readonly IUnityContainer container; public UnityControllerFactory(IUnityContainer container) { this.container = container; } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { if(controllerType != null) return container.Resolve(controllerType) as IController; return base.GetControllerInstance(requestContext, controllerType); } }

其次,你需要告诉MVC框架使用这个控制器工厂而不是它的默认工厂.您可以在Application_Start处理程序中执行此操作.做这个:

ControllerBuilder.Current.SetControllerFactory( new UnityControllerFactory(container));

完成后,您的控制器将通过容器创建,一切都应该开始工作.

标签:Unity2