加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 使用MVC的Unity 2.0 Web.config设置

发布时间:2020-12-16 09:20:53 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试将Unity 2.0用于我当前的MVC项目,并且无法在web.config文件中配置参数注入. 这就是我所拥有的: 1)家庭控制器: public class HomeController : Controller{ IRepository repository = null; public HomeController() { // Always calls this cons
我正在尝试将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));

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读