using System;
using LightInject;
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Mappers;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Persistence.UnitOfWork;
namespace Umbraco.Core.DependencyInjection
{
///
/// Sets the IoC container for the umbraco data layer/repositories/sql/database/etc...
///
public sealed class RepositoryCompositionRoot : ICompositionRoot
{
public void Compose(IServiceRegistry container)
{
container.Register(factory => new DefaultDatabaseFactory(GlobalSettings.UmbracoConnectionName, factory.GetInstance()), new PerContainerLifetime());
container.Register(factory => GetDbContext(factory), new PerContainerLifetime());
container.Register(factory => SqlSyntaxProviders.CreateDefault(factory.GetInstance()), new PerContainerLifetime());
container.Register(new PerContainerLifetime());
container.Register(factory => new PetaPocoUnitOfWorkProvider(factory.GetInstance()), new PerContainerLifetime());
container.Register(factory => new MappingResolver(
factory.GetInstance(),
factory.GetInstance(),
() => factory.GetInstance().ResolveAssignedMapperTypes()),
new PerContainerLifetime());
container.Register();
container.Register(factory => factory.GetInstance().SqlSyntax);
container.Register(factory => CacheHelper.CreateDisabledCacheHelper(), "DisabledCache", new PerContainerLifetime());
container.Register(factory => new PhysicalFileSystem(SystemDirectories.Scripts), "ScriptFileSystem", new PerContainerLifetime());
container.Register(factory => new PhysicalFileSystem(SystemDirectories.MvcViews + "/Partials/"), "PartialViewFileSystem", new PerContainerLifetime());
container.Register(factory => new PhysicalFileSystem(SystemDirectories.MvcViews + "/MacroPartials/"), "PartialViewMacroFileSystem", new PerContainerLifetime());
container.Register(factory => new PhysicalFileSystem(SystemDirectories.Css), "StylesheetFileSystem", new PerContainerLifetime());
container.Register(factory => new PhysicalFileSystem(SystemDirectories.Masterpages), "MasterpageFileSystem", new PerContainerLifetime());
container.Register(factory => new PhysicalFileSystem(SystemDirectories.MvcViews), "ViewFileSystem", new PerContainerLifetime());
//Repository factories:
//NOTE: Wondering if we can pass in parameters at resolution time with LightInject
// without having to manually specify the ctor for each one, have asked here: https://github.com/seesharper/LightInject/issues/237
container.Register((factory, work) => new NotificationsRepository(work, factory.GetInstance()));
container.Register((factory, work) => new ExternalLoginRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new PublicAccessRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new TaskRepository(
work,
factory.GetInstance("DisabledCache"), //never cache
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new AuditRepository(
work,
factory.GetInstance("DisabledCache"), //never cache
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new TagRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new ContentRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance>()(work),
factory.GetInstance>()(work),
factory.GetInstance>()(work),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new ContentTypeRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance>()(work),
factory.GetInstance()));
container.Register((factory, work) => new DataTypeDefinitionRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance>()(work),
factory.GetInstance()));
container.Register((factory, work) => new DictionaryRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance>()(work),
factory.GetInstance()));
container.Register((factory, work) => new LanguageRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new MediaRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance>()(work),
factory.GetInstance>()(work),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new MediaTypeRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new RelationRepository(
work,
factory.GetInstance("DisabledCache"), //never cache
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance>()(work),
factory.GetInstance()));
container.Register((factory, work) => new RelationTypeRepository(
work,
factory.GetInstance("DisabledCache"), //never cache
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new ScriptRepository(
work,
factory.GetInstance("ScriptFileSystem"),
factory.GetInstance()));
container.Register((factory, work) => new PartialViewRepository(
work,
factory.GetInstance("ScriptFileSystem")),
serviceName: "PartialViewFileSystem");
container.Register((factory, work) => new PartialViewMacroRepository(
work,
factory.GetInstance("PartialViewMacroFileSystem")),
serviceName: "PartialViewMacroRepository");
container.Register((factory, work) => new StylesheetRepository(
work,
factory.GetInstance("StylesheetFileSystem")));
container.Register((factory, work) => new TemplateRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance("MasterpageFileSystem"),
factory.GetInstance("ViewFileSystem"),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new MigrationEntryRepository(
work,
factory.GetInstance("DisabledCache"), //never cache
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new ServerRegistrationRepository(
work,
factory.GetInstance().StaticCache, //special static cache scenario
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new UserTypeRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new UserRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance>()(work),
factory.GetInstance()));
container.Register((factory, work) => new MacroRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new MemberRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance>()(work),
factory.GetInstance>()(work),
factory.GetInstance>()(work),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new MemberTypeRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new MemberGroupRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new EntityRepository(
work,
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new DomainRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new TaskTypeRepository(
work,
factory.GetInstance("DisabledCache"), //never cache
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
container.Register((factory, work) => new EntityContainerRepository(
work,
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance(),
factory.GetInstance()));
}
///
/// Creates and initializes the db context when IoC requests it
///
///
///
private DatabaseContext GetDbContext(IServiceFactory container)
{
var dbCtx = new DatabaseContext(
container.GetInstance(),
container.GetInstance(),
container.GetInstance());
//when it's first created we need to initialize it
dbCtx.Initialize();
return dbCtx;
}
}
}