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; } } }