代码之家  ›  专栏  ›  技术社区  ›  JontyMC

MVC源代码单例模式

  •  5
  • JontyMC  · 技术社区  · 14 年前

    private Func<IControllerFactory> _factoryThunk;
    
    public void SetControllerFactory(IControllerFactory controllerFactory) {
        _factoryThunk = () => controllerFactory;
    }
    

    为什么不能直接分配控制器工厂?,即:

    private IControllerFactory _factory;
    
    public void SetControllerFactory(IControllerFactory controllerFactory) {
        _factory = controllerFactory;
    }
    
    public void SetControllerFactory(Type controllerFactoryType) {
        _factory = (IControllerFactory)Activator.CreateInstance(controllerFactoryType);
    }
    
    1 回复  |  直到 14 年前
        1
  •  4
  •   Kirk Woll    14 年前

    _factoryThunk Func<IControllerFactory> 它是支持两种重载的通用方法:

    void SetControllerFactory(Type);
    void SetControllerFactory(IControllerFactory);
    

    第一个的实现使用以下事实 是一个 Func 宣布 功能 使用内联 Activator 实例化 Type

    this._factoryThunk = delegate {
        IControllerFactory factory;
        try
        {
            factory = (IControllerFactory) Activator.CreateInstance(controllerFactoryType);
        }
        catch (Exception exception)
        {
            throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.ControllerBuilder_ErrorCreatingControllerFactory, new object[] { controllerFactoryType }), exception);
        }
        return factory;
    };
    

    被宣布为 功能

    _factoryThunk = controllerFactory;
    

    _工厂链接 controllerFactory 是一个 IControllerFactory --不兼容的类型。