# IT:AD:Design:Blueprints:Initialization # * [[../|(UP)]] {{indexmenu>.#2|nsort tsort}} Starting an application -- getting it from a state of uselessness in the form of *.dll's sitting on the hard-drive, to a state of in-memory, ready for use, cached for performance, synchronized for scalability, etc. -- takes a lot. And yet...it's usually left to just a development process of not much more thought than fiddling till the the yellow screen of death is finally gone. That's not a strategy. ## Notes ## ### Quick List of common startup activities ### * The application actually starts... * A first (but false) indication that it has all it's required assemblies. * Load application settings (settings shared across all server)s. * Load host settings (application settings specific to the current server in a load balanced or n-tier environment). * Ensure the connectionstring is correct, and permissions are correctly configured in order to access the database in read only mode. * Ensure the connectionstring is correct, and permissions are correctly configured in order to access the database in read/write mode. * Register basic Infrastructure Services. * At this point Finally got some logging working. * Register the rest of the Infrastructure Services. * Register Domain Services. * These generally never fail as they have no inrfastructure dependency. * Register Application Services. * With both Infrastructure and Domain Services, Application Services has everything it needs to startup. * Potentially Creating the database (using CodeFirst's mechanism). * Generally this is a bad bad bad idea unless you are sure that you in a dev environment...but I'll just mention it anyway. * Potentially Seeding data into the database in case its empty. * Generally this is a bad bad idea...but I'll just mention it anyway. * Registering ObjectMapping Maps. You'll need them to map entities across tiers as dto's etc. * Fetching common reference data. * In doing so, proves that mapping seems to be working -- at least for the DTO stuff. * Caching the common reference data. * Cache the reference data in a format as close to the Presentation requirements as possible. * etc... (i'm sure there's a bit more, but I'll stop here today). ### Use an Dependency Inversion Container System ### Study after study after study clearly demonstrate that the reason for projects being unmaintainable is...making monolithic software with tight coupling. Yet...year after year, I watch enterprise developers start new software projects choosing technologies that promote tight coupling. Stop! Using a Dependency Inversion Container system -- such as [[IT/#Unity/]], [[IT/#Ninject/]] or any other is a prerequisite to delivering maintainable value to a client. It's so important, so basic a competence, that at this time I will not lead or be involved in any way on a software project that does not use it. ### Bootstrapping ### Dependency Inversion solves many problems -- but brings with it challenges -- especially at the initialization stage. ## Resources ## * [Dependency Injection in Libraries](http://msdn.microsoft.com/en-us/magazine/ee335709.aspx): Initialization used in EntLib 5.0 ... same problem.