Files
Umbraco-CMS/src/Umbraco.Core/Persistence/RepositoryResolver.cs

63 lines
2.1 KiB
C#

using System;
using System.Linq;
using System.Reflection;
using Umbraco.Core.ObjectResolution;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.UnitOfWork;
namespace Umbraco.Core.Persistence
{
/// <summary>
/// A resolver used to return the current implementation of the RepositoryInstanceFactory
/// </summary>
internal class RepositoryResolver : SingleObjectResolverBase<RepositoryResolver, RepositoryFactory>
{
internal RepositoryResolver(RepositoryFactory registrar)
: base(registrar)
{
}
/// <summary>
/// Can be used by developers at runtime to set their own RepositoryInstanceFactory at app startup
/// </summary>
/// <param name="factory"></param>
public void SetRepositoryInstanceFactory(RepositoryFactory factory)
{
Value = factory;
}
/// <summary>
/// Returns the RepositoryInstanceFactory object
/// </summary>
internal RepositoryFactory Factory
{
get { return Value; }
}
/// <summary>
/// Return the repository based on the type
/// </summary>
/// <typeparam name="TRepository"></typeparam>
/// <param name="unitOfWork"></param>
/// <returns></returns>
internal TRepository ResolveByType<TRepository>(IUnitOfWork unitOfWork)
where TRepository : class, IRepository
{
var createMethod = this.Value.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)
.First(x => x.Name == "Create" + typeof (TRepository).Name.Substring(1));
if (createMethod.GetParameters().Count() != 1
|| !createMethod.GetParameters().Single().ParameterType.IsType<IUnitOfWork>())
{
throw new FormatException("The method " + createMethod.Name + " must only contain one parameter of type " + typeof(IUnitOfWork).FullName);
}
if (!createMethod.ReturnType.IsType<TRepository>())
{
throw new FormatException("The method " + createMethod.Name + " must return the type " + typeof(TRepository).FullName);
}
return (TRepository) createMethod.Invoke(this.Value, new object[] {unitOfWork});
}
}
}