这就是我所拥有的:
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));
完成后,您的控制器将通过容器创建,一切都应该开始工作.
