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;
+ }
}
}