jcr*_*898 5 asp.net castle-windsor ioc-container asp.net-mvc-3
我目前正在测试Castle Windsor vs. Ninject,我非常喜欢Windsor提供的产品,我只是遇到了存储库注入的问题.
所以,这是设置......我有一个看起来像这样的ControllersInstaller ......
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(FindControllers().Configure(ConfigureControllers()));
}
private BasedOnDescriptor FindControllers()
{
return AllTypes.FromThisAssembly()
.BasedOn<IController>()
.If(Component.IsInSameNamespaceAs<HomeController>())
.If(t => t.Name.EndsWith("Controller"));
}
private ConfigureDelegate ConfigureControllers()
{
return c => c.LifeStyle.Transient;
}
}
Run Code Online (Sandbox Code Playgroud)
一个看起来像这样的上下文安装程序
public class ContextInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Where(t => t.Name == "MyContext"));
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个看起来像......的repo安装程序
public class RepoInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Where(type => type.Name.EndsWith("Repo"))
.WithService.DefaultInterface()
.Configure(c => c.LifeStyle.Singleton));
}
}
Run Code Online (Sandbox Code Playgroud)
然后在Global.asax中我通过...注册它们
private static void BootstrapContainer()
{
var container = new WindsorContainer() // Create a container to hold the dependencies
.Install(
new ContextInstaller(),
new RepoInstaller(),
new ControllersInstaller()
); // Scan this assembly for all IWindsorInstaller
var controllerFactory = new WindsorControllerFactory(container.Kernel); // Create a new instance
ControllerBuilder.Current.SetControllerFactory(controllerFactory); // Use my factory instead of default
}
Run Code Online (Sandbox Code Playgroud)
我家的控制器看起来像......
public class HomeController : Controller
{
IMyRepo _repo;
public HomeController(MyRepo repo)
{
_repo = repo;
}
Run Code Online (Sandbox Code Playgroud)
但无论出于什么原因,当我调试我得到的东西时...这个组件的某些依赖关系无法静态解决.MyProject.Controllers.HomeController正在等待以下依赖项:服务: - 未注册的MyProject.Models.MyRepo.
我无法弄清楚为什么!我尝试将我的repo安装程序安装为singleton,我尝试重新排序注册过程,以便repo在控制器之前进行设置.
当我调试并点击Global.asax中的控制器工厂线时,它表示除HomeController之外的所有内容都已正确解析.
思考?
如果您注册包含接口 .WithService.DefaultInterface() 的存储库,您的依赖性必须基于接口(可能是 IRepo)而不是具体的。
如果您的依赖项基于具体,则删除 .WithService.DefaultInterface() ,因此依赖项将得到解决...但这不是最好的方法:存储库始终具有基于接口的依赖项
| 归档时间: |
|
| 查看次数: |
2519 次 |
| 最近记录: |