加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 城堡windsor控制器工厂和存储库无法解决

发布时间:2020-12-16 03:26:01 所属栏目:asp.Net 来源:网络整理
导读:我目前正在测试Castle Windsor vs. Ninject,我非常喜欢Windsor提供的产品,我只是遇到了存储库注入的问题. 所以,这是设置……我有一个看起来像这样的ControllersInstaller …… public class ControllersInstaller : IWindsorInstaller{ public void Install(
我目前正在测试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;
    }
}

一个看起来像这样的上下文安装程序

public class ContextInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container,IConfigurationStore store)
    {
        container.Register(AllTypes.FromThisAssembly()
            .Where(t => t.Name == "MyContext"));
    }
}

还有一个看起来像……的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));
    }
}

然后在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
    }

我家的控制器看起来像……

public class HomeController : Controller
{
    IMyRepo _repo;

    public HomeController(MyRepo repo)
    {
        _repo = repo;
    }

但无论出于什么原因,当我调试我得到的东西时……
无法静态解析此组件的某些依赖项. MyProject.Controllers.HomeController正在等待以下依赖项:服务: – 未注册的MyProject.Models.MyRepo.

我无法弄清楚为什么!我尝试将我的repo安装程序安装为singleton,我尝试重新排序注册过程,以便repo在控制器之前进行设置.

当我调试并点击Global.asax中的控制器工厂线时,它表示除HomeController之外的所有内容都已正确解析.

思考?

解决方法

如果您注册包含接口的存储库
.WithService.DefaultInterface()
你的依赖必须基于接口(也许是IRepo)而不是具体的.

如果你的依赖是基于具体的,那么删除.WithService.DefaultInterface(),所以依赖将被解析……但这不是最好的方法:因为Repository总是依赖于Interface

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读