/// <summary>
        /// Initializes a new instance of the <see cref="ApplicationContext"/> class.
        /// </summary>
        /// <param name="options">A reference to the application configuration.</param>
        /// <param name="itemTypeLoader">A reference to the item type loader in use.</param>
        /// <param name="monsterTypeLoader">A reference to the monster type loader in use.</param>
        /// <param name="telemetryClient">A reference to the telemetry client.</param>
        /// <param name="cancellationTokenSource">A reference to the master cancellation token source.</param>
        /// <param name="dbContextGenerationFunc">A reference to a function to generate the database context.</param>
        public ApplicationContext(
            IOptions <ApplicationContextOptions> options,
            IItemTypesLoader itemTypeLoader,
            IMonsterTypesLoader monsterTypeLoader,
            TelemetryClient telemetryClient,
            CancellationTokenSource cancellationTokenSource,
            Func <IFibulaDbContext> dbContextGenerationFunc)
        {
            options.ThrowIfNull(nameof(options));
            itemTypeLoader.ThrowIfNull(nameof(itemTypeLoader));
            monsterTypeLoader.ThrowIfNull(nameof(monsterTypeLoader));
            cancellationTokenSource.ThrowIfNull(nameof(cancellationTokenSource));
            dbContextGenerationFunc.ThrowIfNull(nameof(dbContextGenerationFunc));

            DataAnnotationsValidator.ValidateObjectRecursive(options.Value);

            this.Options = options.Value;
            this.CancellationTokenSource = cancellationTokenSource;

            this.TelemetryClient = telemetryClient;

            this.itemTypeLoader            = itemTypeLoader;
            this.monsterTypeLoader         = monsterTypeLoader;
            this.contextGenerationFunction = dbContextGenerationFunc;
        }
Example #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="MonsterTypeReadOnlyRepository"/> class.
        /// </summary>
        /// <param name="monsterTypeLoader">A reference to the monster type loader in use.</param>
        public MonsterTypeReadOnlyRepository(IMonsterTypesLoader monsterTypeLoader)
        {
            monsterTypeLoader.ThrowIfNull(nameof(monsterTypeLoader));

            if (monsterTypeCatalog == null)
            {
                lock (MonsterTypeCatalogLock)
                {
                    if (monsterTypeCatalog == null)
                    {
                        monsterTypeCatalog = monsterTypeLoader.LoadTypes();
                    }
                }
            }
        }
Example #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="UnitOfWork"/> class.
        /// </summary>
        /// <param name="applicationContext">The application context to work in.</param>
        /// <param name="itemTypeLoader">A reference to the item type loader in use.</param>
        /// <param name="monsterTypeLoader">A reference to the monster type loader in use.</param>
        public UnitOfWork(IApplicationContext applicationContext, IItemTypesLoader itemTypeLoader, IMonsterTypesLoader monsterTypeLoader)
        {
            applicationContext.ThrowIfNull(nameof(applicationContext));

            this.applicationContext = applicationContext;

            this.databaseContextLock = new object();

            this.accounts = new Lazy <AccountRepository>(
                () =>
            {
                this.GetOrInitializeDbContext();

                return(new AccountRepository(this.databaseContext));
            },
                System.Threading.LazyThreadSafetyMode.None);

            this.characters = new Lazy <CharacterRepository>(
                () =>
            {
                this.GetOrInitializeDbContext();

                return(new CharacterRepository(this.databaseContext));
            },
                System.Threading.LazyThreadSafetyMode.None);

            this.MonsterTypes = new MonsterTypeReadOnlyRepository(monsterTypeLoader);

            this.ItemTypes = new ItemTypeReadOnlyRepository(itemTypeLoader);
        }