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

标签 asp.net-mvc web-config unity-container

我正在尝试将 Unity 2.0 用于我当前的 MVC 项目,但在 web.config 文件中配置参数注入(inject)时遇到问题。

这是我所拥有的:

1) 家庭 Controller :

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();
    }

具有两个构造函数的基本 Controller 。第一个不带参数,第二个以 IRepository 作为参数(应该由 Unity 注入(inject))

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
}

future 将成为 SQL 存储库,但目前它仅实现 IRepository 接口(interface)的 1 个成员,即 GetInts() 并返回整数列表。

3) IRepository 接口(interface)

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

一个接口(interface)。

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 repository) 永远不会被调用。我很确定我没有在 web.config 文件中正确设置。但我不确定如何正确设置,以便调用 HomeController 上的正确构造函数。请帮助:)

&谢谢:)

最佳答案

您的 Unity 配置看起来不错。问题是您没有将 Unity 连接到 MVC 框架,因此该框架没有使用容器来创建您的 Controller ,而是 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 框架使用这个 Controller 工厂而不是默认 Controller 工厂。您在 Application_Start 处理程序中执行此操作。这样做:

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

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

关于asp.net-mvc - 使用 MVC 的 Unity 2.0 Web.config 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3925019/

相关文章:

asp.net-mvc - 如何将 json 对象从 Javascript 传递到 asp.net mvc Controller

jquery - 使用 DataTables 时 AJAX Post 不再起作用

asp.net-mvc - 在 ASP.NET MVC 中可以有多个级别的主视图吗?

asp.net-mvc - 使用 web.config 中的位置标记进行 IIS7 和 301 永久重定向

visual-studio - 如何在使用 GIT 和 WebDeploy 发布时隐藏 web.config appsetting 参数

c# - 如何使用 Prism 和 Unity 实现 "View Model First"?

asp.net-mvc - 依赖注入(inject)和 ModelStateWrapper

c# - ASP 网络核心 : add many to many relationship with IdentityUser

asp.net - 通过 web.config 从页面输出中删除 BOM

dependency-injection - MVC 4 和 Unity,向 WebAPI Controller 注入(inject)依赖项