/// <summary> /// Returns a new AppContext instance with the specificed services injected. /// </summary> /// <param name="options">A collection of custom options that can be used by AppService UoW classes for application specific purposes.</param> /// <returns></returns> public TAppContext NewAppContext(AppOptions options) { TAppContext result = new TAppContext(); result._errorLogger = _errorLogger; result._auditLogger = _auditLogger; result._backgroundAction = _backgroundAction; if (options != null) { result._options = options; } else { result._options = _options; } foreach (var appService in _appServices) { AppServicesBase appServiceInst = (AppServicesBase)Activator.CreateInstance(appService.Value); appServiceInst.InitializeAppService(result); result._reusableAppServices.Add(appService.Key, appServiceInst); } return(result); }
/// <summary> /// Create a new UoW app service in this context. /// </summary> public AppServicesBase GetAppService(Type appServiceType) { if (this.AllowedAppServiceTypes != null && !this.AllowedAppServiceTypes.Contains(appServiceType)) { throw new InvalidOperationException("App service of this type is not allowed in this app context."); } AppServicesBase result = null; if (appServiceType.IsInterface) { result = _reusableAppServices[appServiceType]; } else { if (appServiceType.IsAssignableFrom(typeof(AppServicesBase))) { ReusableInContextAppServiceAttribute reusableInContextAttribute = Attribute.GetCustomAttribute(appServiceType, typeof(ReusableInContextAppServiceAttribute)) as ReusableInContextAppServiceAttribute; if (reusableInContextAttribute != null) { result = _reusableAppServices[appServiceType]; if (result == null) { lock (_reusableAppServicesSyncRoot) { result = _reusableAppServices[appServiceType]; if (result == null) { result = (AppServicesBase)Activator.CreateInstance(appServiceType); _reusableAppServices.Add(appServiceType, result); result.InitializeAppService(this); } } } } else { result = (AppServicesBase)Activator.CreateInstance(appServiceType); result.InitializeAppService(this); } } else { throw new InvalidOperationException("The requested type is not an interface or an AppServiceBase derived type."); } } if (result == null) { throw new KeyNotFoundException("The requested app service does not exist."); } return(result); }
/// <summary> /// Detach an app service from this context. Useful for when you do not want SavingChanges() event to fire in the app service when committing to the store. /// </summary> public void DetachAppService(AppServicesBase appService) { appService.DetachFromAppContext(); }