diff --git a/Source/Csla.Shared/ApplicationContext.cs b/Source/Csla.Shared/ApplicationContext.cs index 29375e9664..f4a756b2e8 100644 --- a/Source/Csla.Shared/ApplicationContext.cs +++ b/Source/Csla.Shared/ApplicationContext.cs @@ -814,9 +814,33 @@ internal static void SetLogicalExecutionLocation(LogicalExecutionLocations locat { LocalContext["__logicalExecutionLocation"] = location; } -#endregion + #endregion + + #region ServiceProvider + + /// + /// Gets or sets the default service provider + /// for this application. + /// + public static IServiceProvider DefaultServiceProvider + { + get => _contextManager.GetDefaultServiceProvider(); + set => _contextManager.SetDefaultServiceProvider(value); + } + + /// + /// Gets or sets the service provider + /// for this application context. + /// + public static IServiceProvider ScopedServiceProvider + { + get => _contextManager.GetScopedServiceProvider(); + set => _contextManager.SetScopedServiceProvider(value); + } + + #endregion -#region Default context manager + #region Default context manager /// /// Default context manager for the user property @@ -951,8 +975,48 @@ public void SetGlobalContext(ContextDictionary globalContext) LocalDataStoreSlot slot = Thread.GetNamedDataSlot(_globalContextName); Thread.SetData(slot, globalContext); } + + private static IServiceProvider _provider; + + /// + /// Gets the default IServiceProvider + /// + public IServiceProvider GetDefaultServiceProvider() + { + return _provider; + } + + /// + /// Sets the default IServiceProvider + /// + /// IServiceProvider instance + public void SetDefaultServiceProvider(IServiceProvider serviceProvider) + { + _provider = serviceProvider; + } + + /// + /// Gets the scoped IServiceProvider + /// + public IServiceProvider GetScopedServiceProvider() + { + IServiceProvider result; + result = (IServiceProvider)GetLocalContext().GetValueOrNull("__ssp"); + if (result == null) + result = GetDefaultServiceProvider(); + return result; + } + + /// + /// Sets the scoped IServiceProvider + /// + /// IServiceProvider instance + public void SetScopedServiceProvider(IServiceProvider serviceProvider) + { + GetLocalContext()["__ssp"] = serviceProvider; + } } -#endregion + #endregion } } \ No newline at end of file diff --git a/Source/Csla.Shared/Configuration/CslaConfiguration.cs b/Source/Csla.Shared/Configuration/CslaConfiguration.cs index e901f905ea..091fc76cfc 100644 --- a/Source/Csla.Shared/Configuration/CslaConfiguration.cs +++ b/Source/Csla.Shared/Configuration/CslaConfiguration.cs @@ -17,7 +17,6 @@ namespace Csla.Configuration /// public class CslaConfiguration : ICslaConfiguration { -#if !NETSTANDARD2_0 /// /// Sets the web context manager. /// @@ -32,7 +31,6 @@ public ICslaConfiguration WebContextManager(IContextManager contextManager) ApplicationContext.WebContextManager = contextManager; return this; } -#endif /// /// Sets the context manager. @@ -115,6 +113,16 @@ public ICslaConfiguration PropertyInfoFactory(string typeName) return this; } + /// + /// Sets the default IServiceProvider for the application. + /// + /// IServiceProvider instance + public ICslaConfiguration DefaultServiceProvider(IServiceProvider serviceProvider) + { + ApplicationContext.DefaultServiceProvider = serviceProvider; + return this; + } + /// /// Resets any ApplicationContext settings so they /// re-read their configuration from AppSettings diff --git a/Source/Csla.Shared/Core/IContextManager.cs b/Source/Csla.Shared/Core/IContextManager.cs index 6738162a87..7430a6c307 100644 --- a/Source/Csla.Shared/Core/IContextManager.cs +++ b/Source/Csla.Shared/Core/IContextManager.cs @@ -58,5 +58,23 @@ public interface IContextManager /// /// Global context. void SetGlobalContext(ContextDictionary globalContext); + /// + /// Gets the default IServiceProvider + /// + IServiceProvider GetDefaultServiceProvider(); + /// + /// Sets the default IServiceProvider + /// + /// IServiceProvider instance + void SetDefaultServiceProvider(IServiceProvider serviceProvider); + /// + /// Gets the scoped IServiceProvider + /// + IServiceProvider GetScopedServiceProvider(); + /// + /// Sets the scoped IServiceProvider + /// + /// IServiceProvider instance + void SetScopedServiceProvider(IServiceProvider serviceProvider); } } \ No newline at end of file diff --git a/Source/Csla.Web.Mvc.Shared/ApplicationContextManager.cs b/Source/Csla.Web.Mvc.Shared/ApplicationContextManager.cs index 70f5a981ee..9e73f61366 100644 --- a/Source/Csla.Web.Mvc.Shared/ApplicationContextManager.cs +++ b/Source/Csla.Web.Mvc.Shared/ApplicationContextManager.cs @@ -138,6 +138,40 @@ public void SetGlobalContext(ContextDictionary globalContext) { HttpContext.Items[_globalContextName] = globalContext; } + + /// + /// Gets the default IServiceProvider + /// + public IServiceProvider GetDefaultServiceProvider() + { + return HttpContext?.RequestServices; + } + + /// + /// Sets the default IServiceProvider + /// + /// IServiceProvider instance + public void SetDefaultServiceProvider(IServiceProvider serviceProvider) + { + throw new InvalidOperationException(); + } + + /// + /// Gets the scoped IServiceProvider + /// + public IServiceProvider GetScopedServiceProvider() + { + return HttpContext?.RequestServices; + } + + /// + /// Sets the scoped IServiceProvider + /// + /// IServiceProvider instance + public void SetScopedServiceProvider(IServiceProvider serviceProvider) + { + throw new InvalidOperationException(); + } } } #endif \ No newline at end of file diff --git a/Source/Csla.Web.Shared/ApplicationContextManager.cs b/Source/Csla.Web.Shared/ApplicationContextManager.cs index 06a6a03888..63f6e33403 100644 --- a/Source/Csla.Web.Shared/ApplicationContextManager.cs +++ b/Source/Csla.Web.Shared/ApplicationContextManager.cs @@ -107,5 +107,47 @@ public void SetGlobalContext(ContextDictionary globalContext) { HttpContext.Current.Items[_globalContextName] = globalContext; } + + /// + /// Gets the default IServiceProvider + /// + public IServiceProvider GetDefaultServiceProvider() + { + IServiceProvider result; + result = (IServiceProvider)GetLocalContext().GetValueOrNull("__dsp"); + if (result == null) + result = GetDefaultServiceProvider(); + return result; + } + + /// + /// Sets the default IServiceProvider + /// + /// IServiceProvider instance + public void SetDefaultServiceProvider(IServiceProvider serviceProvider) + { + GetLocalContext()["__dsp"] = serviceProvider; + } + + /// + /// Gets the scoped IServiceProvider + /// + public IServiceProvider GetScopedServiceProvider() + { + IServiceProvider result; + result = (IServiceProvider)GetLocalContext().GetValueOrNull("__ssp"); + if (result == null) + result = GetDefaultServiceProvider(); + return result; + } + + /// + /// Sets the scoped IServiceProvider + /// + /// IServiceProvider instance + public void SetScopedServiceProvider(IServiceProvider serviceProvider) + { + GetLocalContext()["__ssp"] = serviceProvider; + } } } \ No newline at end of file diff --git a/Source/Csla.test/AppContext/TestContext.cs b/Source/Csla.test/AppContext/TestContext.cs index fa938460e5..bdb326cddb 100644 --- a/Source/Csla.test/AppContext/TestContext.cs +++ b/Source/Csla.test/AppContext/TestContext.cs @@ -74,5 +74,45 @@ public void SetGlobalContext(ContextDictionary globalContext) { _myContext[_globalContextName] = globalContext; } + + private static IServiceProvider _provider; + + /// + /// Gets the default IServiceProvider + /// + public IServiceProvider GetDefaultServiceProvider() + { + return _provider; + } + + /// + /// Sets the default IServiceProvider + /// + /// IServiceProvider instance + public void SetDefaultServiceProvider(IServiceProvider serviceProvider) + { + _provider = serviceProvider; + } + + /// + /// Gets the scoped IServiceProvider + /// + public IServiceProvider GetScopedServiceProvider() + { + IServiceProvider result; + result = (IServiceProvider)GetLocalContext().GetValueOrNull("__ssp"); + if (result == null) + result = GetDefaultServiceProvider(); + return result; + } + + /// + /// Sets the scoped IServiceProvider + /// + /// IServiceProvider instance + public void SetScopedServiceProvider(IServiceProvider serviceProvider) + { + GetLocalContext()["__ssp"] = serviceProvider; + } } }