Skip to content

Instantly share code, notes, and snippets.

@bmcdavid
Created November 22, 2017 02:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bmcdavid/2f335314b3bda9839f34acbc31c1a903 to your computer and use it in GitHub Desktop.
Save bmcdavid/2f335314b3bda9839f34acbc31c1a903 to your computer and use it in GitHub Desktop.
Epi Test Decorator
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