Created
November 22, 2017 02:09
-
-
Save bmcdavid/2f335314b3bda9839f34acbc31c1a903 to your computer and use it in GitHub Desktop.
Epi Test Decorator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using EPiServer.Framework; | |
using EPiServer.Framework.Initialization; | |
using EPiServer.ServiceLocation; | |
using System.Web.Mvc; | |
using System.Collections.Generic; | |
namespace AlloyCms11.Business.Initialization | |
{ | |
public class DefaultProvider : DataAnnotationsModelMetadataProvider { } | |
public class WrappedProvider : ModelMetadataProvider | |
{ | |
private readonly ModelMetadataProvider _inner; | |
public WrappedProvider(ModelMetadataProvider inner) | |
{ | |
_inner = inner; | |
} | |
public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType) | |
{ | |
return _inner.GetMetadataForProperties(container, containerType); | |
} | |
public override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, string propertyName) | |
{ | |
return _inner.GetMetadataForProperty(modelAccessor, containerType, propertyName); | |
} | |
public override ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType) | |
{ | |
return _inner.GetMetadataForType(modelAccessor, modelType); | |
} | |
} | |
[InitializableModule] | |
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))] | |
[ModuleDependency(typeof(ServiceContainerInitialization))] | |
public class DecorateTest : IConfigurableModule, IInitializableModule | |
{ | |
private ServiceConfigurationContext _context; | |
public void ConfigureContainer(ServiceConfigurationContext context) | |
{ | |
// uncomment for testing wrapped provider | |
// context.Services.Add<ModelMetadataProvider, DefaultProvider>(ServiceInstanceScope.Singleton); | |
_context = context; // store context for init complete | |
// cannot do here as Structure hasn't been set as ServiceLocator.Current // its current empty and does nothing | |
//context.ConfigurationComplete += (sender, eventArgs) => => SetModelMetadataProvider(context); | |
} | |
private void SetModelMetadataProvider(ServiceConfigurationContext context) | |
{ | |
if (!context.Services.Contains(typeof(ModelMetadataProvider))) | |
{ | |
context.Services.Add<ModelMetadataProvider, DefaultProvider>(ServiceInstanceScope.Singleton); | |
} | |
else | |
{ | |
var inner = ServiceLocator.Current.GetInstance<ModelMetadataProvider>(); | |
// or alternative is if you want to get to raw container, but I would like to avoid a Structuremap package dependency | |
// context.StructureMap().GetInstance<ModelMetadataProvider>(); | |
context.Services.AddSingleton<ModelMetadataProvider>(new WrappedProvider(inner)); | |
} | |
} | |
void IInitializableModule.Initialize(InitializationEngine context) | |
{ | |
// wrap modelmetaprovider here | |
context.InitComplete += (sender, eventArgs) => SetModelMetadataProvider(_context); | |
} | |
void IInitializableModule.Uninitialize(InitializationEngine context) { } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment