This blog post gives you early information on Release 4.3 of Glass.Mapper.Sc! Check out the new features and let us know what you think.
In this release we have changed how pipelines are handled by Glass.Mapper. We are no longer using the Sitecore style pipelines where each task in the pipeline is automatically called after the previous task unless an abort has been called.
Instead we are moving to the Middleware pipeline style used by the new ASP.NET Core MVC where a task explicitly calls the next task in the pipeline or decides to do something else. We have made this change for several reasons:
Firstly the following interfaces have been replaced with abstract classes:
All pipeline tasks now inherit from the AbstractPipelineTask which contains two important methods:
Normally you can just override the Execute method and when you are ready to call the next task in the pipeline you simple call base.Execute, for example:
public class MyTask : AbstractObjectConstructionTask{ public override void Execute(ObjectConstructionArgs args) { //do some work base.Execute(args); } }
Any tasks that you have already created pre version 4.3 will need to be updated to work with this approach. For more information on how a Middleware pipeline works please read Microsoft information:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware
One of the many great features of Glass.Mapper is the ability to cache your models and then reuse them almost anywhere in your solution. However this came with one restriction, you need to turn off lazy loading for any properties that referenced other Sitecore items. This was to ensure that all data was loaded in the same context as the originally requested model. A model would look like this:
public class MyModel { [SitecoreParent(IsLazy=false)] public virtual MyParent Parent { get; set; } [SitecoreChildren(IsLazy=false)] public virtual MyChild Children {get; set; } }
This solution had several problems:
In this release we have introduced the DisableLazyLoading class. If your model has been marked as Cachable then we will automatically disable lazy loading while the model is constructed which includes all models generated via property references. Therefore if your mark a model as cachable you no longer need to set the IsLazy = false flag. We have also added a depth check mechanism that attempts to detect if a cached model contains a loop. This is achieved by counting the depth of the models created, for example the requested model is at depth 1, a model mapped to a property of this model is depth 2, a model mapped to that model is depth 3 and so on. The depth check allows a maximum depth of 8 before throwing an exception.
If you wish to disable these new features you can use the following code:
var factory = dependencyResolver.ObjectConstructionFactory as AbstractConfigFactory<AbstractObjectConstructiontask>; factory.Remove<ModelDepthCheck>(); config.EnableLazyLoadingForCachableModels = true;
This feature can be controlled by the config setting EnableLazyLoadingForCachableModels which is set to true by default.
We have update the diagnostic information we supply so that it gives more information. Once diagnostics have been enabled you will be able to monitor the following object creation information:
We have been working on some improvements to the GetModelFromView processor after a report of a performance problem by Alex (Issue 253). From out testing it seems that the first load of any CSHTML files would take a long time. This was caused by the compiling of the CSHTML file using the BuildManager.GetCompiledType method. Added to this we were also compiling Sitecore SPEAK views.
To solve this we have made to changes, firstly any request for a CSHTML file when the site is Shell will be ignored (we assume it is a SPEAK view). Secondly we have extracted how we find the target type. By default Glass will now use a Regex resolver which is significantly quicker. Since this has been abstracted you can now swap this for alternative implementations if you need something more specific and we have created a resolver that works with Compile Razor views which we will blog soon!
If you find issues with the Regex View Resolve causes issue with your solution you can configure Glass to use the original version with this code:
GetModelFromView.ViewTypeResolver = new ChainedViewTypeResolver( new IViewTypeResolver[] { new RegexViewTypeResolver(), new BuildManagerViewTypeResolver() });
This code can be added to the PostLoad event of the GlassMapperScCustom class.
We have spent a lot of time getting unit tests running on the build server and we have now successfully got the majority of them running. Unit tests on the build server are run against Sitecore versions 8.0, 8.1 and 8.2 with a total of 2200+ tests run per build!
We have also fully embraced Sitecore FakeDB making it much easier for contributors to test their changes.
Glass.Mappper.Sc is supported by the generous donations of the Glass.Mapper.Sc community! Their donations help fund the time, effort and hosting for the project.
These supporters are AMAZING and a huge thank you to all of you. You can find our list of supporters on the Rockstars page.
If you use Glass.Mapper.Sc and find it useful please consider supporting the project. Not only will you help the project but you could also get a discount on the Glass.Mapper.Sc training and join the Rockstars page.