概述Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少。MVC提供了非常多的扩展点,本文主要关注Orchard所做的扩展。主要集中在如下几个方面: 1、Routing(路由)相关2、Controller相关3、ViewEngines相关4、Model绑定(Binding)相关5、Model验证器(Validator)相关 我们将分几个篇幅来分别分析。 参考资料:How ASP.NET MVC Works(强烈推荐)ASP.NET MVC中你必须知道的13个扩展点...
我们首先还是看看ReflectedParameterBindingInfo的Binder属性吧: public override IModelBinder Binder { get { IModelBinder binder = ModelBinders.GetBinderFromAttributes(_parameterInfo, () => String.Format(CultureInfo.CurrentCulture, MvcResources.ReflectedParameterBindingInfo_MultipleConverterAttributes, _parameterInfo.Name, _paramete...
1、Session文档介绍毋庸置疑学习.Net core最好的方法之一就是学习微软.Net core的官方文档;https://docs.microsoft.com/zh-cn/aspnet/core; .Net core Session的官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/app-state .Net core Session Github源码 https://github.com/aspnet/Session2、Session简单应用 2.1、在Startup类的ConfigureServices方法中添加services.AddDistributedMemoryCache(); service...
创建完ApplicationModel后,调用ControllerActionDescriptorBuilder类的Build方法创建对应的ControllerActionDescriptorinternal static class ControllerActionDescriptorBuilder{public static IList<ControllerActionDescriptor> Build(ApplicationModel application){return ApplicationModelFactory.Flatten(application, CreateActionDescriptor);}private static ControllerActionDescriptor CreateActionDescriptor(Applic...
看下应用如何构建出对应的ActionDescriptor DefaultActionDescriptorCollectionProviderinternal class DefaultActionDescriptorCollectionProvider : ActionDescriptorCollectionProvider{private readonly IActionDescriptorProvider[] _actionDescriptorProviders;private readonly IActionDescriptorChangeProvider[] _actionDescriptorChangeProviders;// The lock is used to protect WRITES to the following (do not need...
public class KestrelServer : IServer{private readonly List<(IConnectionListener, Task)> _transports = new List<(IConnectionListener, Task)>();private readonly IServerAddressesFeature _serverAddresses;private readonly IConnectionListenerFactory _transportFactory;private bool _hasStarted;private int _stopping;private readonly TaskCompletionSource<object> _stoppedTcs = new TaskCompletionSource<object...