在网站初始化时调用这样一句话:更改默认的controller 容器:
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());
UnityControllerFactory()继承了 DefaultControllerFactory,下面加粗的话是更换容器的关键
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (null == controllerType)
{
return null;
}
IController controller = (IController)this.UnityContainer.Resolve(controllerType);
return controller;
}
在升级Unity版本的时候出错了,说没有那个动态文件文件,Unget 已经是最新的了,反编译最新的dll, 在ILspy 中看到,dll 下的namespace ,在下一级是类。
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
</configSections>
<unity> <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>这样配置就对了。
编译之后,还是错误。说是没有Service.dll, 疑惑!在package下也确实没有!
之后恍然,主界面没有引用这个。这也就是IOC的强大之处。只引用Interface 就可以编译通过,Service.dll是通过配置文件配的,可以替换,只要替换者实现这个接口就行。
最后在Controller 的构造函数中传入接口即可使用了。
public class UsersController : Controller
{
private WanJiaTaiContext db = new WanJiaTaiContext();
ISex sex;
public UsersController(ISex _sex)
{
sex = _sex;
}
........................
}
另外,有一条配置是这样的
<register type="System.Data.Entity.DbContext,EntityFramework" mapTo="WanJiaTai.Models.WanJiaTaiContext,WanJiaTai.Models"/>
注意,后面的WanJiaTai.Models 是dll 名称,而不是项目名称,这样会报错: configSection.Configure(container, containerName);
所以,应该改为
<register type="System.Data.Entity.DbContext,EntityFramework" mapTo="WanJiaTai.Models.WanJiaTaiContext,WanJiaTai"/>