public static IDependencyEngine Setup(IDependencyEngine dependencyEngine)
        {
            const DependencyLifeStyle applicationLifeStyle           = DependencyLifeStyle.Singleton;
            const DependencyLifeStyle controllerLifeStyle            = DependencyLifeStyle.Transient;
            const DependencyLifeStyle photoServiceLifeStyle          = DependencyLifeStyle.Transient;
            const DependencyLifeStyle optOutServiceLifeStyle         = DependencyLifeStyle.Transient;
            const DependencyLifeStyle authenticationServiceLifeStyle = DependencyLifeStyle.Transient;

            // application
            dependencyEngine.RegisterAndDecorate <IApplicationConfigurationProvider, ApplicationConfigurationProvider, CachedApplicationConfigurationProvider>(applicationLifeStyle);
            dependencyEngine.Register <IUserSession, AspNetUserSession>(applicationLifeStyle);
            dependencyEngine.Register <ICacheProvider, CacheProvider>(applicationLifeStyle);
            dependencyEngine.Register <ILoggerFactory, LoggerFactory>(applicationLifeStyle);
            dependencyEngine.Register <IHttpContextProvider, HttpContextProvider>(applicationLifeStyle);
            dependencyEngine.Register <IAuthenticationStorage, FormsAuthenticationStorage>(applicationLifeStyle);

            // home
            dependencyEngine.Register <HomeController>(controllerLifeStyle);

            // authentication
            dependencyEngine.Register <AccountController>(controllerLifeStyle);
            dependencyEngine.Register <IAuthenticationProvider, FlickrAuthenticationProvider>(authenticationServiceLifeStyle);

            // photo
            dependencyEngine.Register <PhotoController>(controllerLifeStyle);
            dependencyEngine.Register <IPhotoEngine, FlickrPhotoEngine>(photoServiceLifeStyle);
            dependencyEngine.Register <IFlickrPhotoProvider, FlickrPhotoProvider>(photoServiceLifeStyle);
            dependencyEngine.Register <IFlickrConverter, FlickrConverter>(photoServiceLifeStyle);
            dependencyEngine.Register <IFlickrFactory, FlickrFactory>(photoServiceLifeStyle);
            dependencyEngine.RegisterAndDecorate <IUserEngine, FlickrUserEngine, CachedUserEngine>(photoServiceLifeStyle);

            // opt-out checker
            dependencyEngine.RegisterAndDecorate <IUserService, UserService, CachedUserService>(optOutServiceLifeStyle);
            dependencyEngine.Register <IUserReaderService, UserReaderService>(optOutServiceLifeStyle);

            // legacy
            dependencyEngine.Register <LegacyController>(controllerLifeStyle);

            // opt-out
            dependencyEngine.Register <SettingsController>(controllerLifeStyle);
            dependencyEngine.Register <IUserStorePathProvider, UserStorePathProvider>(optOutServiceLifeStyle);
            dependencyEngine.Register <IUserStore, UserStore>(optOutServiceLifeStyle);
            dependencyEngine.Register <IUserStoreService, UserStoreService>(optOutServiceLifeStyle);
            dependencyEngine.Register <IUserWriterService, UserWriterService>(optOutServiceLifeStyle);

            //exif
            dependencyEngine.Register <IFlickrExifEngine, FlickrExifEngine>(photoServiceLifeStyle);
            dependencyEngine.Register <IFlickrStatisticsEngine, FlickrStatisticsEngine>(photoServiceLifeStyle);

            // test
            dependencyEngine.Register <TestController>(controllerLifeStyle);

            var dependencyResolver = new EnginedDependencyResolver(dependencyEngine);

            DependencyResolver.SetResolver(dependencyResolver);

            return(dependencyEngine);
        }
        public static IDependencyEngine Setup(IDependencyEngine dependencyEngine)
        {
            const DependencyLifeStyle applicationLifeStyle = DependencyLifeStyle.Singleton;
            const DependencyLifeStyle controllerLifeStyle = DependencyLifeStyle.Transient;
            const DependencyLifeStyle photoServiceLifeStyle = DependencyLifeStyle.Transient;
            const DependencyLifeStyle optOutServiceLifeStyle = DependencyLifeStyle.Transient;
            const DependencyLifeStyle authenticationServiceLifeStyle = DependencyLifeStyle.Transient;

            // application
            dependencyEngine.RegisterAndDecorate<IApplicationConfigurationProvider, ApplicationConfigurationProvider, CachedApplicationConfigurationProvider>(applicationLifeStyle);
            dependencyEngine.Register<IUserSession, AspNetUserSession>(applicationLifeStyle);
            dependencyEngine.Register<ICacheProvider, CacheProvider>(applicationLifeStyle);
            dependencyEngine.Register<ILoggerFactory, LoggerFactory>(applicationLifeStyle);
            dependencyEngine.Register<IHttpContextProvider, HttpContextProvider>(applicationLifeStyle);
            dependencyEngine.Register<IAuthenticationStorage, FormsAuthenticationStorage>(applicationLifeStyle);

            // home
            dependencyEngine.Register<HomeController>(controllerLifeStyle);

            // authentication
            dependencyEngine.Register<AccountController>(controllerLifeStyle);
            dependencyEngine.Register<IAuthenticationProvider, FlickrAuthenticationProvider>(authenticationServiceLifeStyle);

            // photo
            dependencyEngine.Register<PhotoController>(controllerLifeStyle);
            dependencyEngine.Register<IPhotoEngine, FlickrPhotoEngine>(photoServiceLifeStyle);
            dependencyEngine.Register<IFlickrPhotoProvider, FlickrPhotoProvider>(photoServiceLifeStyle);
            dependencyEngine.Register<IFlickrConverter, FlickrConverter>(photoServiceLifeStyle);
            dependencyEngine.Register<IFlickrFactory, FlickrFactory>(photoServiceLifeStyle);
            dependencyEngine.RegisterAndDecorate<IUserEngine, FlickrUserEngine, CachedUserEngine>(photoServiceLifeStyle);

            // opt-out checker
            dependencyEngine.RegisterAndDecorate<IUserService, UserService, CachedUserService>(optOutServiceLifeStyle);
            dependencyEngine.Register<IUserReaderService, UserReaderService>(optOutServiceLifeStyle);

            // legacy
            dependencyEngine.Register<LegacyController>(controllerLifeStyle);

            // opt-out
            dependencyEngine.Register<SettingsController>(controllerLifeStyle);
            dependencyEngine.Register<IUserStorePathProvider, UserStorePathProvider>(optOutServiceLifeStyle);
            dependencyEngine.Register<IUserStore, UserStore>(optOutServiceLifeStyle);
            dependencyEngine.Register<IUserStoreService, UserStoreService>(optOutServiceLifeStyle);
            dependencyEngine.Register<IUserWriterService, UserWriterService>(optOutServiceLifeStyle);

            //exif
            dependencyEngine.Register<IFlickrExifEngine, FlickrExifEngine>(photoServiceLifeStyle);
            dependencyEngine.Register<IFlickrStatisticsEngine, FlickrStatisticsEngine>(photoServiceLifeStyle);

            // test
            dependencyEngine.Register<TestController>(controllerLifeStyle);

            var dependencyResolver = new EnginedDependencyResolver(dependencyEngine);
            DependencyResolver.SetResolver(dependencyResolver);

            return dependencyEngine;
        }
        public static void RegisterComponents(this IDependencyEngine dependencyEngine)
        {
            // Application
            dependencyEngine.Register <IConfigurationProvider, AppSettingConfigurationProvider>(DependencyLifeStyle.Singleton);
            dependencyEngine.Register <IUserSession, AspNetUserSession>(DependencyLifeStyle.Singleton);
            dependencyEngine.Register <ICacheProvider, CacheProvider>(DependencyLifeStyle.Singleton);
            dependencyEngine.Register <ILoggerFactory, NLogLoggerFactory>(DependencyLifeStyle.Singleton);

            // Home
            dependencyEngine.Register <HomeController>(DependencyLifeStyle.PerWebRequest);

            // Authentication
            dependencyEngine.Register <AccountController>(DependencyLifeStyle.PerWebRequest);
            dependencyEngine.Register <IAuthenticationProvider, FlickrAuthenticationProvider>(DependencyLifeStyle.Singleton);

            // Photos
            dependencyEngine.Register <PhotoController>(DependencyLifeStyle.PerWebRequest);
            dependencyEngine.Register <IFlickrFactory, FlickrFactory>(DependencyLifeStyle.Singleton);
            dependencyEngine.Register <IPhotoEngine, FlickrPhotoEngine>(DependencyLifeStyle.Singleton);
            dependencyEngine.RegisterAndDecorate <IUserEngine, FlickrUserEngine, CachedUserEngine>(DependencyLifeStyle.Singleton);
            dependencyEngine.Register <IFlickrPhotoProvider, FlickrPhotoProvider>(DependencyLifeStyle.Singleton);
            dependencyEngine.Register <IFlickrConverter, FlickrConverter>(DependencyLifeStyle.Singleton);

            // Legacy
            dependencyEngine.Register <LegacyController>(DependencyLifeStyle.PerWebRequest);

            // Opt-out
            dependencyEngine.Register <SettingsController>(DependencyLifeStyle.PerWebRequest);
            dependencyEngine.Register <IOptoutUserStorePathProvider, OptoutUserStorePathProvider>(DependencyLifeStyle.Singleton);
            dependencyEngine.Register <IOptoutUserStore, OptoutUserStore>(DependencyLifeStyle.Singleton);
            dependencyEngine.RegisterAndDecorate <IOptoutUserService, OptoutUserService, CachedOptoutUserService>(DependencyLifeStyle.Singleton);
            dependencyEngine.Register <IOptoutUserConfiguratorService, OptoutUserConfiguratorService>(DependencyLifeStyle.Singleton);

            // Test
            dependencyEngine.Register <TestController>(DependencyLifeStyle.PerWebRequest);
        }