【问题标题】:StructureMap with ASP.NET MVC - configure() method is obsolete?带有 ASP.NET MVC 的 StructureMap - configure() 方法已过时?
【发布时间】:2009-04-08 17:03:06
【问题描述】:

我已经使用 CustomControllerFactory 覆盖了 DefaultControllerFactory,它实际上是使用 StructureMAp ObjectFactory 来使用 IOC 构造控制器实例。但是有些如何找不到控制器实例并对其进行故障转移。 笔记。我也已经在 Global.asax 中设置了 DEfaultControllerFactory。那么除了将我的注册表注册到 SM 之外,我还有什么需要做的吗?

我知道注册控制器可以解决问题,但我想知道为什么它不能像 defaultFactory 那样自动检测控制器?

【问题讨论】:

    标签: asp.net-mvc structuremap


    【解决方案1】:

    这是控制器工厂的样子:

    public class ControllerFactory : DefaultControllerFactory
    {
        protected override IController GetControllerInstance(Type controllerType)
        {
            if (controllerType != null)
            {
                return (IController)ObjectFactory.GetInstance(controllerType);
            }
            return null;
        }
    }
    

    StructureMap 配置文件:

    public class DependencyRegistry : Registry
    {
        protected override void configure()
        {
            Scan(x =>
                     {
                         x.Assembly("MyApp.Web");
                         x.Assembly("MyApp.Model");
                         x.Assembly("MyApp.DataAccess");
                         x.With<DefaultConventionScanner>();
                     });
            base.configure();
        }
    
    }
    

    使用默认约定配置 StructureMap 的函数:

    public void RegisterDependencies()
        {
            ObjectFactory.Initialize(InitializeStructureMap);
        }
    
        private void InitializeStructureMap(IInitializationExpression x)
        {
            x.AddRegistry<DependencyRegistry>();
        }
    

    控制器示例:

    public class MyController : Controller
    {
        private IMyRepository _repository;
    
        public MyController (IRepository repository)
        {
            _repository = repository;
        }
    }
    

    别忘了调用 RegisterDependencies() 函数...

    我希望这会有所帮助。

    【讨论】:

    • 请考虑覆盖配置方法已过时。见structuremap.svn.sourceforge.net/svnroot/structuremap/trunk/…
    • 感谢编辑。我从 CodeCampServer 项目中提取了这个小模式。也许你应该让它的作者意识到这一点?
    • @Sebastian:嗨,伙计。您能否详细说明我们应该做什么而不是覆盖(过时的) configure() 方法?源代码(向您的链接点头)说..“[Obsolete("configure() 是不必要的。所有声明都可以在注册表或任何其他方法的构造函数中进行”)]" ...但这没有任何意义到我的小脑袋。 :(请帮忙!
    • @Pure.Krome - 只需使用构造函数。与其重写,不如创建一个构造函数并像之前使用“配置”方法一样使用它。就是这样。
    【解决方案2】:

    您是否在结构图中注册了控制器? (注意,区分大小写)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多