gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:07:24 25 4
gpt4 key购买 nike

我正在尝试将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com