diff --git a/AGENTS.md b/AGENTS.md index 5155252a4..9aedf969a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -61,6 +61,7 @@ Key mechanics (defined in `src/Directory.Build.props` and `test/Directory.Build. - **ANTLR expression parser**: the grammar is `src/Spring/Spring.Core/Expressions/Expression.g`. The generated lexer/parser under `Expressions/Parser/` and a vendored, hand-patched ANTLR 2.7.7 runtime under `Expressions/Parser/antlr/` are **committed — never hand-edit generated files**; regenerate with `./build.cmd Antlr` (see `src/Spring/Spring.Core/README_ANTLR.txt`). - **Versioning**: the git tag is the version authority (`v3.1.0` → 3.1.0); untagged builds fall back to the `ProjectVersion` placeholder in `build-support/build/Build.cs` plus a `dev-`/`preview-` suffix. Publishing runs from the tag workflow only. `DetermineVersion()` sets three distinct facets, applied to **both** `Compile` and `Pack` so packaged and `bin/` assemblies agree: `AssemblyVersion` is pinned to `major.minor.0.0` (the assemblies are strong-named, so this is their binding identity — keeping it stable across patches means consumers need no new binding redirect for a fix release), `FileVersion` carries the exact numeric version, and `InformationalVersion` is left to MSBuild so SourceLink can append `+`. Never set a bare `Version` property instead — it overrides the prefix/suffix composition and silently drops the preview suffix. - **Trusted publishing**: `.github/workflows/publish.yml` is the only workflow allowed to push to nuget.org. It needs `permissions: id-token: write` and `environment: nuget`; the `Publish` target exchanges that OIDC token for a short-lived API key in `build-support/build/Build.Publish.cs`. The nuget.org policy is keyed to the **workflow filename** `publish.yml` plus the `nuget` environment, so renaming, moving or splitting that workflow breaks publishing until the policy is updated. Do not reintroduce a `NUGET_API_KEY` secret — the `NuGetApiKey` parameter stays only as a manual override. +- **Package READMEs and package validation**: every packable project under `src/Spring` has a `README.md` next to its csproj, which `src/Directory.Build.props` packs as the NuGet readme; a new package needs one (what it does, `dotnet add package`, target frameworks, a minimal snippet whose types, members and XML are checked against the code, and links). Pack also runs package validation (`EnablePackageValidation`) against the 3.1.0 packages (`PackageValidationBaselineVersion`) and between the target frameworks of one package; never suppress a difference between two TFMs of one package (Spring.Messaging turns validation off for that reason, see its csproj). Accepted baseline differences live in each project's `CompatibilitySuppressions.xml`; regenerate one with `dotnet pack -c Release -p:ApiCompatGenerateSuppressionFile=true -p:AssemblyVersion=..0.0` and review the diff. A direct `dotnet pack` needs that `-p:AssemblyVersion=..0.0` (what Fallout passes), because the default 1.0.0.0 is below the baseline and fails with CP0003; do not gate the baseline on AssemblyVersion, since Fallout's Restore passes no version and the baseline download would vanish. The baseline has a coverage gap: 3.1.0 shipped net462, which no 4.0 asset is compatible with, so Spring.Web, Spring.Web.Mvc5, Spring.Web.Conversation.NHibernate5 and Spring.Testing.NUnit get no baseline API comparison (PKV006), and for the other packages the 3.1.0 net462 asset is compared with the 4.0 netstandard2.0 build, so no net472 build is compared with 3.1.0. The gap closes when the baseline moves to 4.0.0 once 4.0.0 ships; then delete the 3.1.0 suppression files. - In test projects, `ILog` is a global using alias for `Microsoft.Extensions.Logging.ILogger`. ## Code style diff --git a/BreakingChanges.txt b/BreakingChanges.txt index 500b4509b..15e641bc1 100644 --- a/BreakingChanges.txt +++ b/BreakingChanges.txt @@ -71,11 +71,11 @@ Changes (3.1 to 4.0) 7. Spring.Aop no longer depends on Antlr3.Runtime. 8. The libraries now include a net10.0 build (Spring.Core, Spring.Aop, Spring.Data, - Spring.Data.NHibernate5, Spring.Messaging, Spring.Messaging.Nms and Spring.Scheduling.Quartz3 - target netstandard2.0, net472 and net10.0). NuGet picks lib/net10.0 on .NET 10, where - .NET 10 applications used the netstandard2.0 build before. Applications on .NET 8 and .NET 9 - keep getting the netstandard2.0 build. Spring.Testing.Microsoft stays netstandard2.0 and - net472. Spring.Testing.NUnit targets net10.0 and net472 (see item 9). + Spring.Data.NHibernate5, Spring.Messaging, Spring.Messaging.Nms, Spring.Scheduling.Quartz3 and + Spring.Testing.Microsoft target netstandard2.0, net472 and net10.0). NuGet picks lib/net10.0 + on .NET 10, where .NET 10 applications used the netstandard2.0 build before. Applications on + .NET 8 and .NET 9 keep getting the netstandard2.0 build. Spring.Testing.NUnit targets net10.0 + and net472 (see item 9). - Partial-trust (medium-trust) hosting is no longer supported. Code runs with the caller's trust only: the ExecutePrivileged wrappers and the permission demands are gone. - Code access security is gone. SecurityPermission demands, the SecurityCritical and @@ -108,7 +108,7 @@ Changes (3.1 to 4.0) C# versions use NUnit.Framework.Legacy.ClassicAssert or Assert.That. StringAssert, CollectionAssert, FileAssert and DirectoryAssert remain in NUnit.Framework. - Spring.Testing.Microsoft requires MSTest.TestFramework 4.5.2 or later (was 3.4.3). The base classes - are source compatible with it, and still build for netstandard2.0 and net472. + are source compatible with it, and build for netstandard2.0, net472 and net10.0. Changes (3.0.x to 3.1) ======================== diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 5c521f26a..791744cff 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -23,7 +23,8 @@ https://springframework.net/images/SpringSource_Leaves32x32.png Apache-2.0 https://www.springframework.net/ - Library + + spring;springframework;ioc;di en-US @@ -34,6 +35,11 @@ True + + true + 3.1.0 + False True @@ -67,4 +73,13 @@ + + + README.md + + + + + + diff --git a/src/Spring/Spring.Aop/CompatibilitySuppressions.xml b/src/Spring/Spring.Aop/CompatibilitySuppressions.xml new file mode 100644 index 000000000..5f8717c48 --- /dev/null +++ b/src/Spring/Spring.Aop/CompatibilitySuppressions.xml @@ -0,0 +1,25 @@ + + + + + CP0008 + T:AopAlliance.Aop.AspectException + lib/net462/Spring.Aop.dll + lib/netstandard2.0/Spring.Aop.dll + true + + + CP0008 + T:Spring.Aop.Framework.Adapter.UnknownAdviceTypeException + lib/net462/Spring.Aop.dll + lib/netstandard2.0/Spring.Aop.dll + true + + + CP0008 + T:Spring.Aop.Framework.AopConfigException + lib/net462/Spring.Aop.dll + lib/netstandard2.0/Spring.Aop.dll + true + + \ No newline at end of file diff --git a/src/Spring/Spring.Aop/README.md b/src/Spring/Spring.Aop/README.md new file mode 100644 index 000000000..7becfa4e1 --- /dev/null +++ b/src/Spring/Spring.Aop/README.md @@ -0,0 +1,41 @@ +# Spring.Aop + +Aspect-oriented programming for Spring.NET: dynamic proxies, advice (before, after, around, throws), advisors and +pointcuts, and the `aop:` XML namespace for applying them to objects declared in a Spring container. Interceptors +implement the AOP Alliance interfaces. + +``` +dotnet add package Spring.Aop +``` + +Target frameworks: netstandard2.0, net472, net10.0. Depends on Spring.Core. + +## Usage + +Wrap a target in a proxy that runs an interceptor around every call to the target's interfaces: + +```csharp +using AopAlliance.Intercept; +using Spring.Aop.Framework; + +public class LoggingInterceptor : IMethodInterceptor +{ + public object Invoke(IMethodInvocation invocation) + { + Console.WriteLine("Calling {0}", invocation.Method.Name); + return invocation.Proceed(); + } +} + +var factory = new ProxyFactory(new OrderService()); +factory.AddAdvice(new LoggingInterceptor()); +var service = (IOrderService) factory.GetProxy(); +``` + +`OrderService` is your own class and implements `IOrderService`. + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Aop/Spring.Aop.csproj b/src/Spring/Spring.Aop/Spring.Aop.csproj index c15834796..6dee27710 100644 --- a/src/Spring/Spring.Aop/Spring.Aop.csproj +++ b/src/Spring/Spring.Aop/Spring.Aop.csproj @@ -3,6 +3,7 @@ netstandard2.0;$(TargetFullFrameworkVersion);$(TargetModernFrameworkVersion) Interfaces and classes that provide AOP support in Spring.Net + $(PackageTags);aop;proxy;interception diff --git a/src/Spring/Spring.Core/CompatibilitySuppressions.xml b/src/Spring/Spring.Core/CompatibilitySuppressions.xml new file mode 100644 index 000000000..865588986 --- /dev/null +++ b/src/Spring/Spring.Core/CompatibilitySuppressions.xml @@ -0,0 +1,515 @@ + + + + + CP0001 + T:Spring.Threading.CallContextStorage + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Caching.BaseCacheAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Caching.CacheParameterAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Caching.CacheResultAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Caching.CacheResultItemsAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Caching.InvalidateCacheAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Collections.NoElementsException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Context.ApplicationContextException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Context.Attributes.ConfigurationAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Context.Attributes.DependsOnAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Context.Attributes.ImportAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Context.Attributes.ImportResourceAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Context.Attributes.LazyAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Context.Attributes.ObjectDefAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Context.Attributes.ScopeAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Context.EventListenerAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Context.NoSuchMessageException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Core.CannotLoadObjectTypeException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Core.InvalidPropertyException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Core.MethodInvocationException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Core.NotReadablePropertyException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Core.NotWritablePropertyException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Core.NullValueInNestedPathException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Core.PropertyAccessException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Core.TypeMismatchException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.BaseNode.ArgumentMismatchException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.ANTLRException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.ANTLRPanicException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.CharStreamException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.CharStreamIOException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.MismatchedCharException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.MismatchedTokenException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.NoViableAltException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.NoViableAltForCharException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.RecognitionException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.SemanticException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.TokenStreamException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.TokenStreamIOException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.TokenStreamRecognitionException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Expressions.Parser.antlr.TokenStreamRetryException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.Attributes.AutowiredAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.Attributes.PostConstructAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.Attributes.PreDestroyAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.Attributes.QualifierAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.Attributes.RequiredAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.Attributes.ValueAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.FactoryObjectNotInitializedException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.NoSuchObjectDefinitionException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.ObjectCreationException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.ObjectCurrentlyInCreationException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.ObjectDefinitionException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.ObjectDefinitionStoreException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.ObjectInitializationException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.ObjectIsNotAFactoryException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.ObjectNotOfRequiredTypeException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.Parsing.ObjectDefinitionParsingException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.Support.ObjectDefinitionValidationException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.UnsatisfiedDependencyException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.Factory.Xml.NamespaceParserAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.FatalObjectException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.ObjectsException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Objects.PropertyAccessExceptionsException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Pool.PoolException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Proxy.ProxyIgnoreAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Stereotype.ComponentAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Stereotype.ControllerAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Stereotype.RepositoryAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Stereotype.ServiceAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Threading.TimeoutException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Util.FatalReflectionException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Util.ReflectionException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Validation.ValidatedAttribute + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + + CP0008 + T:Spring.Validation.ValidationException + lib/net462/Spring.Core.dll + lib/netstandard2.0/Spring.Core.dll + true + + \ No newline at end of file diff --git a/src/Spring/Spring.Core/README.md b/src/Spring/Spring.Core/README.md new file mode 100644 index 000000000..15df4145d --- /dev/null +++ b/src/Spring/Spring.Core/README.md @@ -0,0 +1,39 @@ +# Spring.Core + +The core of Spring.NET: the IoC container (object factories and application contexts configured from XML or code), the +Spring Expression Language (SpEL), type conversion, resource abstraction, validation and the dynamic reflection helpers +the other Spring.NET packages build on. + +``` +dotnet add package Spring.Core +``` + +Target frameworks: netstandard2.0, net472, net10.0. + +## Usage + +Define objects in XML, then load them through an application context: + +```xml + + + + + +``` + +```csharp +using Spring.Context; +using Spring.Context.Support; + +IApplicationContext context = new XmlApplicationContext("file://objects.xml"); +Greeter greeter = context.GetObject("greeter"); +``` + +Spring.NET logs through Microsoft.Extensions.Logging. Assign `Spring.LogManager.LoggerFactory` at startup to receive its output. + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Core/Spring.Core.csproj b/src/Spring/Spring.Core/Spring.Core.csproj index d04f667d6..4cae4ee4c 100644 --- a/src/Spring/Spring.Core/Spring.Core.csproj +++ b/src/Spring/Spring.Core/Spring.Core.csproj @@ -3,6 +3,7 @@ netstandard2.0;$(TargetFullFrameworkVersion);$(TargetModernFrameworkVersion) Core functionality for Spring.Net IoC container + $(PackageTags);expressions;validation 219, 162, 618, 1591 diff --git a/src/Spring/Spring.Data.NHibernate5/CompatibilitySuppressions.xml b/src/Spring/Spring.Data.NHibernate5/CompatibilitySuppressions.xml new file mode 100644 index 000000000..07d798bfe --- /dev/null +++ b/src/Spring/Spring.Data.NHibernate5/CompatibilitySuppressions.xml @@ -0,0 +1,46 @@ + + + + + CP0001 + T:Spring.Data.NHibernate.Support.OpenSessionInViewModule + lib/net462/Spring.Data.NHibernate5.dll + lib/netstandard2.0/Spring.Data.NHibernate5.dll + true + + + CP0008 + T:Spring.Data.NHibernate.HibernateAdoException + lib/net462/Spring.Data.NHibernate5.dll + lib/netstandard2.0/Spring.Data.NHibernate5.dll + true + + + CP0008 + T:Spring.Data.NHibernate.HibernateObjectRetrievalFailureException + lib/net462/Spring.Data.NHibernate5.dll + lib/netstandard2.0/Spring.Data.NHibernate5.dll + true + + + CP0008 + T:Spring.Data.NHibernate.HibernateOptimisticLockingFailureException + lib/net462/Spring.Data.NHibernate5.dll + lib/netstandard2.0/Spring.Data.NHibernate5.dll + true + + + CP0008 + T:Spring.Data.NHibernate.HibernateQueryException + lib/net462/Spring.Data.NHibernate5.dll + lib/netstandard2.0/Spring.Data.NHibernate5.dll + true + + + CP0008 + T:Spring.Data.NHibernate.HibernateSystemException + lib/net462/Spring.Data.NHibernate5.dll + lib/netstandard2.0/Spring.Data.NHibernate5.dll + true + + \ No newline at end of file diff --git a/src/Spring/Spring.Data.NHibernate5/README.md b/src/Spring/Spring.Data.NHibernate5/README.md new file mode 100644 index 000000000..bb550cde0 --- /dev/null +++ b/src/Spring/Spring.Data.NHibernate5/README.md @@ -0,0 +1,48 @@ +# Spring.Data.NHibernate5 + +NHibernate 5 integration for Spring.NET: `LocalSessionFactoryObject` builds an NHibernate `ISessionFactory` inside the +container, `HibernateTemplate` handles sessions, `HibernateTransactionManager` lets NHibernate take part in Spring +transactions. `SessionScope` shares a session across a block of code, and `OpenSessionInViewModule` does it per web request on +.NET Framework. + +``` +dotnet add package Spring.Data.NHibernate5 +``` + +Target frameworks: netstandard2.0, net472, net10.0. Depends on Spring.Core, Spring.Aop, Spring.Data and NHibernate 5.7.1 or later. + +## Usage + +```xml + + + + + + + assembly://MyApp/MyApp.Domain/Customer.hbm.xml + + + + + + + + +``` + +```csharp +using System.Collections; +using Spring.Data.NHibernate; + +var template = new HibernateTemplate(sessionFactory); +IList customers = template.Find("from Customer"); +``` + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Data.NHibernate5/Spring.Data.NHibernate5.csproj b/src/Spring/Spring.Data.NHibernate5/Spring.Data.NHibernate5.csproj index 330f39ae3..229bb242c 100644 --- a/src/Spring/Spring.Data.NHibernate5/Spring.Data.NHibernate5.csproj +++ b/src/Spring/Spring.Data.NHibernate5/Spring.Data.NHibernate5.csproj @@ -3,6 +3,7 @@ netstandard2.0;$(TargetFullFrameworkVersion);$(TargetModernFrameworkVersion) Interfaces and classes that provide NHibernate 5 support in Spring.Net + $(PackageTags);nhibernate;orm;transactions Spring.Data.NHibernate 0618 diff --git a/src/Spring/Spring.Data/CompatibilitySuppressions.xml b/src/Spring/Spring.Data/CompatibilitySuppressions.xml new file mode 100644 index 000000000..bfdc7b88f --- /dev/null +++ b/src/Spring/Spring.Data/CompatibilitySuppressions.xml @@ -0,0 +1,354 @@ + + + + + CP0001 + T:Spring.Data.Core.ServiceDomainPlatformTransactionManager + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0001 + T:Spring.Data.Support.DefaultServiceDomainAdapter + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0001 + T:Spring.Data.Support.IServiceDomainAdapter + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0001 + T:Spring.Data.Support.SimpleServiceConfig + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.CannotAcquireLockException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.CannotSerializeTransactionException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.CleanupFailureDataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.ConcurrencyFailureException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.DataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.DataAccessResourceFailureException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.DataIntegrityViolationException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.DataRetrievalFailureException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.DeadlockLoserDataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.EmptyResultDataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.IncorrectResultSizeDataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.IncorrectUpdateSemanticsDataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.InvalidDataAccessApiUsageException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.InvalidDataAccessResourceUsageException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.NonTransientDataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.NonTransientDataAccessResourceException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.ObjectOptimisticLockingFailureException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.ObjectRetrievalFailureException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.OptimisticLockingFailureException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.PermissionDeniedDataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.PessimisticLockingFailureException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.TransientDataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.TransientDataAccessResourceException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.TypeMismatchDataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Dao.UncategorizedDataAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Data.BadSqlGrammarException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Data.CannotGetAdoConnectionException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Data.DuplicateKeyException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Data.InvalidResultSetAccessException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Data.UncategorizedAdoException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.CannotCreateTransactionException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.HeuristicCompletionException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.IllegalTransactionStateException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.Interceptor.NoRollbackRuleAttribute + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.Interceptor.RollbackRuleAttribute + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.Interceptor.TransactionAttribute + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.InvalidIsolationLevelException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.InvalidTimeoutException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.NestedTransactionNotSupportedException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.NoTransactionException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.TransactionException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.TransactionSuspensionNotSupportedException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.TransactionSystemException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.TransactionTimedOutException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.TransactionUsageException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + + CP0008 + T:Spring.Transaction.UnexpectedRollbackException + lib/net462/Spring.Data.dll + lib/netstandard2.0/Spring.Data.dll + true + + \ No newline at end of file diff --git a/src/Spring/Spring.Data/README.md b/src/Spring/Spring.Data/README.md new file mode 100644 index 000000000..5535b9953 --- /dev/null +++ b/src/Spring/Spring.Data/README.md @@ -0,0 +1,34 @@ +# Spring.Data + +Data access for Spring.NET: the ADO.NET framework (`AdoTemplate`, `IDbProvider`, row mappers, parameter builders and the +`db:` XML namespace) and declarative and programmatic transaction management (`IPlatformTransactionManager`, +`TransactionTemplate`, the `tx:` namespace). You add the ADO.NET provider package yourself, for example +Microsoft.Data.SqlClient on modern .NET (.NET Framework has System.Data.SqlClient built in). + +``` +dotnet add package Spring.Data +``` + +Target frameworks: netstandard2.0, net472, net10.0. Depends on Spring.Core and Spring.Aop. + +## Usage + +```csharp +using System.Data; +using Spring.Data.Common; +using Spring.Data.Generic; + +// "Microsoft.Data.SqlClient" on netstandard2.0 and net10.0. On net472 use "System.Data.SqlClient", +// the only SQL Server alias the net472 build registers. +IDbProvider dbProvider = DbProviderFactory.GetDbProvider("Microsoft.Data.SqlClient"); +dbProvider.ConnectionString = "Server=.;Database=Spring;Integrated Security=true"; + +var template = new AdoTemplate(dbProvider); +var count = (int) template.ExecuteScalar(CommandType.Text, "select count(*) from Customer"); +``` + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Data/Spring.Data.csproj b/src/Spring/Spring.Data/Spring.Data.csproj index a9a131f80..d1ecac35f 100644 --- a/src/Spring/Spring.Data/Spring.Data.csproj +++ b/src/Spring/Spring.Data/Spring.Data.csproj @@ -2,6 +2,7 @@ netstandard2.0;$(TargetFullFrameworkVersion);$(TargetModernFrameworkVersion) Interfaces and classes that provide Data access support in Spring.Net + $(PackageTags);ado.net;adonet;transactions;data-access 1591 diff --git a/src/Spring/Spring.Messaging.Nms/CompatibilitySuppressions.xml b/src/Spring/Spring.Messaging.Nms/CompatibilitySuppressions.xml new file mode 100644 index 000000000..027888cf5 --- /dev/null +++ b/src/Spring/Spring.Messaging.Nms/CompatibilitySuppressions.xml @@ -0,0 +1,39 @@ + + + + + CP0008 + T:Spring.Messaging.Nms.Connections.SynchedLocalTransactionFailedException + lib/net462/Spring.Messaging.Nms.dll + lib/netstandard2.0/Spring.Messaging.Nms.dll + true + + + CP0008 + T:Spring.Messaging.Nms.Listener.Adapter.ListenerExecutionFailedException + lib/net462/Spring.Messaging.Nms.dll + lib/netstandard2.0/Spring.Messaging.Nms.dll + true + + + CP0008 + T:Spring.Messaging.Nms.Listener.RecoveryTimeExceededException + lib/net462/Spring.Messaging.Nms.dll + lib/netstandard2.0/Spring.Messaging.Nms.dll + true + + + CP0008 + T:Spring.Messaging.Nms.Listener.SharedConnectionNotInitializedException + lib/net462/Spring.Messaging.Nms.dll + lib/netstandard2.0/Spring.Messaging.Nms.dll + true + + + CP0008 + T:Spring.Messaging.Nms.Support.Converter.MessageConversionException + lib/net462/Spring.Messaging.Nms.dll + lib/netstandard2.0/Spring.Messaging.Nms.dll + true + + \ No newline at end of file diff --git a/src/Spring/Spring.Messaging.Nms/README.md b/src/Spring/Spring.Messaging.Nms/README.md new file mode 100644 index 000000000..48057322d --- /dev/null +++ b/src/Spring/Spring.Messaging.Nms/README.md @@ -0,0 +1,33 @@ +# Spring.Messaging.Nms + +Apache NMS integration for Spring.NET, used with ActiveMQ and other NMS providers: `NmsTemplate` for sending and receiving +with message conversion, message listener containers, and the `nms:` XML namespace. You add the NMS provider package +yourself, for example Apache.NMS.ActiveMQ. + +``` +dotnet add package Spring.Messaging.Nms +``` + +Target frameworks: netstandard2.0, net472, net10.0. Depends on Spring.Core, Spring.Aop, Spring.Data and Apache.NMS. + +## Usage + +```csharp +using Apache.NMS; +using Spring.Messaging.Nms.Core; + +// connectionFactory comes from your NMS provider, for example Apache.NMS.ActiveMQ. +IConnectionFactory connectionFactory = CreateConnectionFactory(); + +var template = new NmsTemplate(connectionFactory) +{ + DefaultDestinationName = "orders" +}; +template.ConvertAndSend("Hello World"); +``` + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Messaging.Nms/Spring.Messaging.Nms.csproj b/src/Spring/Spring.Messaging.Nms/Spring.Messaging.Nms.csproj index 5a3c2302c..03fd6e5d4 100644 --- a/src/Spring/Spring.Messaging.Nms/Spring.Messaging.Nms.csproj +++ b/src/Spring/Spring.Messaging.Nms/Spring.Messaging.Nms.csproj @@ -2,7 +2,8 @@ netstandard2.0;$(TargetFullFrameworkVersion);$(TargetModernFrameworkVersion) - ActiveMQ support + Apache NMS (ActiveMQ) messaging support in Spring.Net + $(PackageTags);nms;activemq;messaging diff --git a/src/Spring/Spring.Messaging/README.md b/src/Spring/Spring.Messaging/README.md new file mode 100644 index 000000000..2cce18a61 --- /dev/null +++ b/src/Spring/Spring.Messaging/README.md @@ -0,0 +1,37 @@ +# Spring.Messaging + +MSMQ integration for Spring.NET: `MessageQueueTemplate` for sending and receiving with message conversion, queues declared +as container objects (`MessageQueueFactoryObject`), and message listener containers. MSMQ is a Windows feature. + +``` +dotnet add package Spring.Messaging +``` + +Target frameworks: netstandard2.0, net472, net10.0. Depends on Spring.Core and Spring.Data. On net472 it uses the +framework's System.Messaging; the other targets use Experimental.System.Messaging.Signed. + +## Usage + +```xml + + + + + + + + +``` + +```csharp +using Spring.Messaging.Core; + +var queue = context.GetObject("queue"); +queue.ConvertAndSend("Hello World"); +``` + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Messaging/Spring.Messaging.csproj b/src/Spring/Spring.Messaging/Spring.Messaging.csproj index 530571245..034072cf3 100644 --- a/src/Spring/Spring.Messaging/Spring.Messaging.csproj +++ b/src/Spring/Spring.Messaging/Spring.Messaging.csproj @@ -1,7 +1,13 @@ netstandard2.0;$(TargetFullFrameworkVersion);$(TargetModernFrameworkVersion) - Interfaces and classes that provide MSMQ 3.0 support in Spring.Net + Interfaces and classes that provide MSMQ support in Spring.Net + $(PackageTags);msmq;messaging + + false diff --git a/src/Spring/Spring.Scheduling.Quartz3/CompatibilitySuppressions.xml b/src/Spring/Spring.Scheduling.Quartz3/CompatibilitySuppressions.xml new file mode 100644 index 000000000..c2fc71ff3 --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz3/CompatibilitySuppressions.xml @@ -0,0 +1,25 @@ + + + + + CP0008 + T:Spring.Scheduling.Quartz.JobMethodInvocationFailedException + lib/net462/Spring.Scheduling.Quartz3.dll + lib/netstandard2.0/Spring.Scheduling.Quartz3.dll + true + + + CP0008 + T:Spring.Scheduling.Quartz.SchedulingException + lib/net462/Spring.Scheduling.Quartz3.dll + lib/netstandard2.0/Spring.Scheduling.Quartz3.dll + true + + + CP0008 + T:Spring.Scheduling.TaskRejectedException + lib/net462/Spring.Scheduling.Quartz3.dll + lib/netstandard2.0/Spring.Scheduling.Quartz3.dll + true + + \ No newline at end of file diff --git a/src/Spring/Spring.Scheduling.Quartz3/README.md b/src/Spring/Spring.Scheduling.Quartz3/README.md new file mode 100644 index 000000000..34e628f0d --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz3/README.md @@ -0,0 +1,44 @@ +# Spring.Scheduling.Quartz3 + +Quartz.NET 3.x integration for Spring.NET: `SchedulerFactoryObject` creates and manages a Quartz scheduler inside the +container, `JobDetailObject` and `MethodInvokingJobDetailFactoryObject` define jobs, and `SimpleTriggerObject` and +`CronTriggerObject` define triggers, all as ordinary Spring objects that can take injected dependencies. + +``` +dotnet add package Spring.Scheduling.Quartz3 +``` + +Target frameworks: netstandard2.0, net472, net10.0. Depends on Spring.Core, Spring.Data and Quartz 3.22.9 or later. + +## Usage + +Call a method on a container object every second, repeating ten times after the first call: + +```xml + + + + + + + + + + + + + + + + + + + + +``` + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Scheduling.Quartz3/Spring.Scheduling.Quartz3.csproj b/src/Spring/Spring.Scheduling.Quartz3/Spring.Scheduling.Quartz3.csproj index 83ca1c8ca..d0c4c9283 100644 --- a/src/Spring/Spring.Scheduling.Quartz3/Spring.Scheduling.Quartz3.csproj +++ b/src/Spring/Spring.Scheduling.Quartz3/Spring.Scheduling.Quartz3.csproj @@ -2,6 +2,7 @@ netstandard2.0;$(TargetFullFrameworkVersion);$(TargetModernFrameworkVersion) Spring.NET Integration with the Quartz Scheduling Library 3.x + $(PackageTags);quartz;scheduling;jobs diff --git a/src/Spring/Spring.Testing.Microsoft/README.md b/src/Spring/Spring.Testing.Microsoft/README.md new file mode 100644 index 000000000..bd82947bf --- /dev/null +++ b/src/Spring/Spring.Testing.Microsoft/README.md @@ -0,0 +1,41 @@ +# Spring.Testing.Microsoft + +Base classes for MSTest that load a Spring application context for your tests, cache it across test classes, inject +dependencies into the test class, and (in the transactional variants) roll back each test's database changes. + +``` +dotnet add package Spring.Testing.Microsoft +``` + +Target frameworks: netstandard2.0, net472, net10.0. Depends on Spring.Core, Spring.Data and MSTest.TestFramework 4.5.2 or later. + +## Usage + +Public properties of the test class are filled from the context by type before each test: + +```csharp +using Spring.Testing.Microsoft; + +[TestClass] +public class OrderServiceTests : AbstractDependencyInjectionSpringContextTests +{ + protected override string[] ConfigLocations => new[] { "assembly://MyApp.Tests/MyApp.Tests/objects.xml" }; + + public IOrderService OrderService { get; set; } + + [TestMethod] + public void PlacesAnOrder() + { + Assert.IsNotNull(OrderService); + } +} +``` + +`AbstractTransactionalSpringContextTests` and `AbstractTransactionalDbProviderSpringContextTests` extend this with a +transaction per test. + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Testing.Microsoft/Spring.Testing.Microsoft.csproj b/src/Spring/Spring.Testing.Microsoft/Spring.Testing.Microsoft.csproj index ac0a8d72d..473103540 100644 --- a/src/Spring/Spring.Testing.Microsoft/Spring.Testing.Microsoft.csproj +++ b/src/Spring/Spring.Testing.Microsoft/Spring.Testing.Microsoft.csproj @@ -1,7 +1,8 @@ - netstandard2.0;$(TargetFullFrameworkVersion) + netstandard2.0;$(TargetFullFrameworkVersion);$(TargetModernFrameworkVersion) Interfaces and classes that provide Microsoft Unit Testing integration in Spring.Net + $(PackageTags);testing;mstest;unit-testing diff --git a/src/Spring/Spring.Testing.NUnit/CompatibilitySuppressions.xml b/src/Spring/Spring.Testing.NUnit/CompatibilitySuppressions.xml new file mode 100644 index 000000000..1be624ce3 --- /dev/null +++ b/src/Spring/Spring.Testing.NUnit/CompatibilitySuppressions.xml @@ -0,0 +1,12 @@ + + + + + PKV006 + .NETFramework,Version=v4.6.2 + + + PKV006 + .NETStandard,Version=v2.0 + + \ No newline at end of file diff --git a/src/Spring/Spring.Testing.NUnit/README.md b/src/Spring/Spring.Testing.NUnit/README.md new file mode 100644 index 000000000..08b7d56e0 --- /dev/null +++ b/src/Spring/Spring.Testing.NUnit/README.md @@ -0,0 +1,43 @@ +# Spring.Testing.NUnit + +Base classes for NUnit that load a Spring application context for your tests, cache it across test fixtures, inject +dependencies into the fixture, and (in the transactional variants) roll back each test's database changes. + +``` +dotnet add package Spring.Testing.NUnit +``` + +Target frameworks: net10.0, net472. There is no netstandard2.0 build because NUnit 5 has none. Depends on Spring.Core, +Spring.Data and NUnit 5.0.0 or later. + +## Usage + +Public properties of the fixture are filled from the context by type before each test: + +```csharp +using NUnit.Framework; +using Spring.Testing.NUnit; + +[TestFixture] +public class OrderServiceTests : AbstractDependencyInjectionSpringContextTests +{ + protected override string[] ConfigLocations => new[] { "assembly://MyApp.Tests/MyApp.Tests/objects.xml" }; + + public IOrderService OrderService { get; set; } + + [Test] + public void PlacesAnOrder() + { + Assert.That(OrderService, Is.Not.Null); + } +} +``` + +`AbstractTransactionalSpringContextTests` and `AbstractTransactionalDbProviderSpringContextTests` extend this with a +transaction per test. + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Testing.NUnit/Spring.Testing.NUnit.csproj b/src/Spring/Spring.Testing.NUnit/Spring.Testing.NUnit.csproj index a242f95f7..634b68879 100644 --- a/src/Spring/Spring.Testing.NUnit/Spring.Testing.NUnit.csproj +++ b/src/Spring/Spring.Testing.NUnit/Spring.Testing.NUnit.csproj @@ -4,6 +4,7 @@ net10.0;$(TargetFullFrameworkVersion) Interfaces and classes that provide NUnit integration in Spring.Net + $(PackageTags);testing;nunit;unit-testing 1587, 1591, 219, 162, 618 diff --git a/src/Spring/Spring.Web.Conversation.NHibernate5/CompatibilitySuppressions.xml b/src/Spring/Spring.Web.Conversation.NHibernate5/CompatibilitySuppressions.xml new file mode 100644 index 000000000..f02cb92ec --- /dev/null +++ b/src/Spring/Spring.Web.Conversation.NHibernate5/CompatibilitySuppressions.xml @@ -0,0 +1,8 @@ + + + + + PKV006 + .NETFramework,Version=v4.6.2 + + \ No newline at end of file diff --git a/src/Spring/Spring.Web.Conversation.NHibernate5/README.md b/src/Spring/Spring.Web.Conversation.NHibernate5/README.md new file mode 100644 index 000000000..3264e64bb --- /dev/null +++ b/src/Spring/Spring.Web.Conversation.NHibernate5/README.md @@ -0,0 +1,54 @@ +# Spring.Web.Conversation.NHibernate5 + +Conversation-per-business-transaction support for Spring.NET web applications using NHibernate 5: a conversation spans +several requests and keeps one NHibernate session open until it ends. `WebConversationManager` tracks the conversations +of a user's session, and `ConversationModule` ends the ones that have timed out. + +``` +dotnet add package Spring.Web.Conversation.NHibernate5 +``` + +Target framework: net472 (ASP.NET on .NET Framework). Depends on Spring.Core, Spring.Data, Spring.Data.NHibernate5 and +NHibernate 5.7.1 or later. Install Spring.Web as well: it is not a package dependency, but session-scoped objects +(`scope="session"`) and `HttpApplicationConfigurer` come from it. + +## Usage + +Declare the manager as a session-scoped object, register the HTTP module in `web.config`, and give the module the manager +names through `HttpApplicationConfigurer`. The template key must equal the module name; without `ConversationManagerNameList` +the module fails on the first request. + +```xml + + + + + + + + + + + + conversationManager + + + + + + +``` + +```xml + + + + + +``` + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Web.Conversation.NHibernate5/Spring.Web.Conversation.NHibernate5.csproj b/src/Spring/Spring.Web.Conversation.NHibernate5/Spring.Web.Conversation.NHibernate5.csproj index 9e557336a..fb936f8bb 100644 --- a/src/Spring/Spring.Web.Conversation.NHibernate5/Spring.Web.Conversation.NHibernate5.csproj +++ b/src/Spring/Spring.Web.Conversation.NHibernate5/Spring.Web.Conversation.NHibernate5.csproj @@ -3,6 +3,7 @@ $(TargetFullFrameworkVersion) Conversation-Per-Business-Transaction support for Spring.Net using NHibernate + $(PackageTags);aspnet;nhibernate;conversation;web diff --git a/src/Spring/Spring.Web.Mvc5/CompatibilitySuppressions.xml b/src/Spring/Spring.Web.Mvc5/CompatibilitySuppressions.xml new file mode 100644 index 000000000..f02cb92ec --- /dev/null +++ b/src/Spring/Spring.Web.Mvc5/CompatibilitySuppressions.xml @@ -0,0 +1,8 @@ + + + + + PKV006 + .NETFramework,Version=v4.6.2 + + \ No newline at end of file diff --git a/src/Spring/Spring.Web.Mvc5/README.md b/src/Spring/Spring.Web.Mvc5/README.md new file mode 100644 index 000000000..10e440654 --- /dev/null +++ b/src/Spring/Spring.Web.Mvc5/README.md @@ -0,0 +1,38 @@ +# Spring.Web.Mvc5 + +ASP.NET MVC 5 and Web API 2 integration for Spring.NET: a dependency resolver that creates controllers and their +dependencies from a Spring application context, and `SpringMvcApplication` as the base class for `Global.asax`. + +``` +dotnet add package Spring.Web.Mvc5 +``` + +Target framework: net472 (ASP.NET on .NET Framework). Depends on Spring.Core, Spring.Web, Microsoft.AspNet.Mvc and +Microsoft.AspNet.WebApi.WebHost 5.3.0 or later. Configure the Spring web module in `web.config` as described in the +Spring.Web package. + +## Usage + +Derive the application class from `SpringMvcApplication`. It registers the Spring dependency resolvers for MVC and Web API, +so controllers are created by the container: + +```csharp +using System.Web.Mvc; +using System.Web.Routing; +using Spring.Web.Mvc; + +public class MvcApplication : SpringMvcApplication +{ + protected void Application_Start() + { + AreaRegistration.RegisterAllAreas(); + RouteConfig.RegisterRoutes(RouteTable.Routes); + } +} +``` + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Web.Mvc5/Spring.Web.Mvc5.csproj b/src/Spring/Spring.Web.Mvc5/Spring.Web.Mvc5.csproj index b9d6b94f6..039fd8965 100644 --- a/src/Spring/Spring.Web.Mvc5/Spring.Web.Mvc5.csproj +++ b/src/Spring/Spring.Web.Mvc5/Spring.Web.Mvc5.csproj @@ -2,6 +2,7 @@ $(TargetFullFrameworkVersion) Interfaces and classes that provide ASP.NET MVC5 application support in Spring.Net + $(PackageTags);aspnet;mvc;webapi;web diff --git a/src/Spring/Spring.Web/CompatibilitySuppressions.xml b/src/Spring/Spring.Web/CompatibilitySuppressions.xml new file mode 100644 index 000000000..f02cb92ec --- /dev/null +++ b/src/Spring/Spring.Web/CompatibilitySuppressions.xml @@ -0,0 +1,8 @@ + + + + + PKV006 + .NETFramework,Version=v4.6.2 + + \ No newline at end of file diff --git a/src/Spring/Spring.Web/README.md b/src/Spring/Spring.Web/README.md new file mode 100644 index 000000000..5497ea0a9 --- /dev/null +++ b/src/Spring/Spring.Web/README.md @@ -0,0 +1,47 @@ +# Spring.Web + +ASP.NET WebForms integration for Spring.NET: a web application context built at startup, request, session and +application scoped objects, dependency injection into pages and user controls, and an extended `Spring.Web.UI.Page` with +data binding, validation, master-page support and result mapping. + +``` +dotnet add package Spring.Web +``` + +Target framework: net472 (ASP.NET on .NET Framework). Depends on Spring.Core. + +## Usage + +Register the Spring module and page handler in `web.config` (IIS integrated pipeline shown), and load the context from the +`spring/objects` section: + +```xml + + +
+
+ + + + + + + + + + + + + + + + +``` + +The page then receives `Message` as a public property. + +## Links + +- [Spring.NET website](https://www.springframework.net/) +- [GitHub repository](https://github.com/spring-projects/spring-net) +- [Breaking changes since 3.x](https://github.com/spring-projects/spring-net/blob/main/BreakingChanges.txt) diff --git a/src/Spring/Spring.Web/Spring.Web.csproj b/src/Spring/Spring.Web/Spring.Web.csproj index 65823b22d..dd4999ca9 100644 --- a/src/Spring/Spring.Web/Spring.Web.csproj +++ b/src/Spring/Spring.Web/Spring.Web.csproj @@ -3,6 +3,7 @@ $(TargetFullFrameworkVersion) Interfaces and classes that provide web application support in Spring.Net + $(PackageTags);aspnet;webforms;web