Release Notes

Here you can find what's new in Gazel. We follow [major].[minor].[patch] version format. It is basically Semantic Versioning , but with a small difference;

  • [major]: Starting from v5.x.x, this part will follow major .NET releases without backward compatibility. So if Gazel is on v5.x.x then it is compatible with .NET 5, if it is v6.x.x then it is compatible with .NET 6, and so on.
  • [minor]: When there is a new feature or a breaking change on top of an existing major release, it means it is a minor release.
  • [patch]: When new release only includes a bugfix or an improvement without a new feature or breaking change, it is only a patch.

v8.0.0

Features

  • Gazel now supports .NET 8!
  • Gazel now supports C# 12!

Library Upgrades

PackageOld VersionNew Version
Routine6.1.38.0.0

v6.4.3

Bugfixes

  • There was an error in the queue when deserializing if there was a list in the parameter while consuming the request, this has been fixed.

v6.4.2

Bugfixes

  • Reading values from appsettings was causing error when registering a client api, fixed

v6.4.1

Bugfixes

  • Client api registration phase order was causing problems, fixed

v6.4.0

Features

  • RequestScopeFeature is added to provide more control over managing scopes and scope interceptors for layers
    • IScopeProvider is introduced, which creates a decorated scope with OnDisposing() event
    • IModuleContext introduces WithScope() method, which returns a ScopedOperation object for local service calls
      • e.g. context.WithScope().Do(() => myManager.DoSomething())

Breaking Changes

  • MessageQueueFeature is now replaced with MessageQueueLayer and QueuedServiceCallFeature. Its functionality is split beetween layer and feature accordingly
    • MessageQueueLayer provides basic configuration and component registration for RabbitMQ setup
    • QueuedServiceCallFeature registers a manager for publishing and consuming service call messages, sets up message queues per enqueued service, adds an interceptor for enqueueing service requests
    • This change requires below changes in Program.cs;
      • queuedServiceCall: c => c.MessageQueuePerService() should be used on top of messageQueue: c => c.RabbitMq().
      • prefetchCount:, continueIfPublishingEventFails: and disableLogMessageListener: options are now moved to the new queuedServiceCall: feature
      • EnqueueAttribute and message event listener interfaces are now moved to Gazel.QueuedServiceCall namespace
      • AddGazelServiceApplication has now two overloads
        • One without messageQueue: and queuedServiceCall:. To disable message queue, use this one.
        • One with a required messageQueue:, and configurable queuedServiceCall:
  • GetServiceInstance extension is moved from ServiceInterceptionContext to ReferenceData
  • Using legacy Startup.cs files creates a problem with IMessageQueueConfiguration and RabbitMqManager.StartAsync() execution order, use Program.cs instead.

Improvements

  • Queued service calls are now consumed without making any extra internal http requests
  • context.Remote calls for queued services now directly publishes message to queue server

Library Upgrades

PackageOld VersionNew Version
FluentNHibernate3.2.03.2.1
Microsoft.AspNetCore.ConcurrencyLimiter6.0.166.0.21
MySql.Data8.0.338.1.0
NHibernate5.4.25.4.6
System.Data.SQLite1.0.1171.0.118

v6.3.3

Improvements

  • RabbitMq multiple host address was not supported, fixed.
  • Settings are supporting List<T> usage.

Library Upgrades

PackageOld VersionNew Version
Microsoft.Extensions.Logging6.0.0removed
Microsoft.Extensions.Logging.Abstractionsnew6.0.4

When you use ILogger and ILoggerFactory in log processes, you will not be affected by the library change here. If you are affected, you should switch to using ILogger and ILoggerFactory.

v6.3.2

Improvements

  • It wasn't possible to create stub instances for client api struct dto's, fixed.

v6.3.1

Improvements

  • UseRequestId was not correctly overriding RequestId for delayed remote calls, fixed

Bugfixes

  • RestApiLayer was not applying config to Swagger and SwaggerUI, fixed
  • Client Api rendering backward compatibility fixes;
    • Constructor parameter or a property with HiddenInClientApi marked type was causing error, fixed
    • Constructor parameters with different type but a matching name with a property was causing error, fixed
    • Constructor overloads with parameters partially matching all properties was causing error, fixed
    • Operations containing output only parameters or input only return type were not ignored or rendered properly, fixed
    • Robject constructor was not available for input only struct DTOs and causing error with schema generated from a previous version, fixed
    • ToRobject method was not available for output only struct DTOs and causing error with schema generated from a previous version, fixed

v6.3.0

Features

  • IApplicationCache is introduced with a default implementation as a singleton that uses ConcurrentDictionary behind the scenes.
    • You can either inject IApplicationCache or access it through IContext.Application property.
    • Similarly IRequestCache is also introduced for the sake of consistency. You can access it from IModuleContext.Request.Cache.
  • Official swagger support has finally arrived. Gazel now automatically configures Swashbuckle to render a compatible swagger document. Your ApiApplication instance will redirect to swagger ui by default where you can make calls to your API.
    • You may also add configuration using swaggerOptions, swaggerGenOptions and swaggerUIOptions in restApi: configuration as well as using the new ISwaggerConfiguration interface.
  • Cors feature is reintroduced. This time using the standard .AddCors() extension, with configurations forwarded directly to this extension. This is to make sure it is added in the correct order.
  • Records are now supported for creating DTOs as an alternative for struct DTOs
  • You can now override request id for a remote call
    • e.g. context.Remote.On(this).UseRequestId(myRequestId).Do(() => ...)

Breaking Changes

  • Rest api template was ignoring list parameters in service signature, fixed.
    • If you wrote a custom route that matches a service with a list parameter, you will need to change the service signature in your route configuration. (e.g. Parameter signature for List<string> names has changed from String names to List<String> names)
  • Type of the Cache property in IModuleContext.Request is changed from ICache to IRequestCache. This change should not cause any issues unless you have a custom implementation of IModuleContext.
  • Nullable support for DTO structs resulted in the following breaking changes:
    • Output DTOs are now rendered as struct in generated code for client api
    • Object model of output nullable structs now has data
    • Object model of input nullable structs now has initializer

Improvements

  • When queued service request's token became invalid, it was causing error due to failing token validation before its execution. Queued service requests are no longer validated for a second time.
  • When caching an async method result, ICache was caching the Task object itself instead of awaiting its result, fixed.
  • Auditable attribute now has RequestId property. Empty client request IDs are auto generated if set to RequestIdMode.Optional.
  • Rest api was generating list parameter names with List suffix incorrectly, fixed.
  • Input structs were marked as OutputData, fixed
  • Struct types, which can be used both as input and output DTO, were not rendered properly and caused compiler error when client code was generated, fixed

Bugfixes

  • Remote invoking of an overloaded operation with minimum number of required parameters was causing error, fixed.
    • IRemoteServiceInvoker Invoke methods with object parameters are now obsolete.
  • When autocreating database tables for MySQL, precisions for DateTime and Timestamp, length for EncryptedString, precision and scale for Money.Value were set incorrectly, fixed,
  • Nullable struct types were not recognized as value type and rendered as string in RestApi, fixed
    • All nullable structs are now marked as HiddenInClientApi and not rendered in generated client code for backward compatibility
  • Unhandled messages were not included in log by default, fixed

Library Upgrades

PackageOld VersionNew Version
Basic.Reference.Assemblies.Net601.4.11.4.2
FluentNHibernate3.1.03.2.0
Microsoft.AspNetCore.ConcurrencyLimiter6.0.136.0.16
Microsoft.CodeAnalysis.CSharp4.4.04.6.0
MySql.Data8.0.328.0.33
NHibernate5.4.05.4.2
NHibernate.Caches.CoreMemoryCache5.8.05.9.0
Npgsql6.0.86.0.9
RabbitMQ.Client6.4.06.5.0

v6.2.0

Breaking Changes

  • includeProductNameInModuleNames option is renamed as includeComponentNameInModuleNames to conform to .NET project naming standards
    • include-product-name option in Gazel.Cli package also renamed as include-component-name for the same reason
  • middleware: parameter in AddGazelMiddlewareApplication was unnecessary, removed
  • AuditOption is renamed to AuditFeature

Improvements

  • Documentation is updated;
    • Under Configurations section; Application Session, Business Logic, Command Line, Gateway, Http Header, Service, Service Client sections are completed
    • Features / Audit is completed
    • Options section is completed

Bugfixes

  • Client Api was not loading application model from remote, fixed

v6.1.1

Improvements

  • context is re-introduced as an Obsolete property in Query to provide a more convenient transition to Gazel 6
  • Context property is also introduced in Query to be used instead of context

Bugfixes

  • Generic domain types were causing stack overflow, fixed

Library Upgrades

PackageOld VersionNew Version
Routine6.1.26.1.3

v6.1.0

Features

  • Concurrency limiter is now available in all web applications. You can configure it via concurrencyLimiter: c => c.AspNetCore(...).
  • IEmbeddedResourceReader interface is added to be able to mock embedded resources during unit tests. You can access it from IModuleContext and IContext via context.EmbeddedResource property.

Breaking Changes

  • Gazel.Client package is now removed and merged into Gazel.Configuration
    • Everything under Gazel.Client is now under Gazel.ClientApi namespace
    • Configurer is renamed as ClientApiRegistrar
      • Former static Configure method is replaced with Register instance method
    • Register method now directly registers generated client api interface instead of returning IClientContext
    • RegisterClientApi component configuration overload is removed, use IComponentModelBuilderConfiguration to manipulate client api manager interface registrations
    • Caching in Gazel.Client was not being used, completely removed
    • httpContextAccessor configuration in Gazel.Client was unnecessary, removed
    • requestScope configuration in Gazel.Client was unnecessary, removed
  • Client api configuration classes are moved to Features namespace and renamed to fit their service application counterparts;
    • appToken is renamed as authentication
    • exception is renamed as exceptionHandling
      • Notifier in exception handling is renamed as ResultCodeProcessor
    • logger is renamed as logging
    • security is renamed as secureCall
  • SetSession was removed from TestBase, use SetUpSession
  • IRestApiConfiguration is renamed to IRestTemplateConfiguration
  • Protected context field in Query class is renamed to _context

Improvements

  • Service application was not running when a dependent service is down, fixed
  • Gazel.Web.Header was causing conflicts when a backend uses client package, fixed
  • IApplicationScope now uses Concurrent Dictionary for access safety
  • ICodeCompilerConfiguration interface is added to RestApiLayer for enabling CodeCompiler configuration
  • Client Api now allows you to add custom service client and interception configurations using its new feature system
  • ICached many to one references are now lazy loaded to avoid unnecessary joins
  • NHibernate's core memory cache configuration is now available under CacheConfigurer.CoreMemory

Bugfixes

  • Proxy types were causing an error in service layer, fixed
  • Request's CultureInfo such as ar-SA was causing incorrect date and time to string conversions, fixed

Library Upgrades

PackageOld VersionNew Version
Microsoft.AspNetCore.ConcurrencyLimiternew6.0.13
MySql.Data8.0.318.0.32
NHibernate5.3.145.4.0
Npgsql6.0.76.0.8
Routine6.1.06.1.2
System.Data.SQLite1.0.1161.0.117

v6.0.0

Features

  • Gazel now supports .NET 6!
  • Gazel.Cli now accepts --environment option to set environment for subprocess that generates schema from bin directory.
  • ReadOnlyMemory<byte> is now supported in service input & output, client-api and db mapping.

Breaking Changes

  • .NET 5 is not supported any more
  • HttpWebResponse in IGatewayConfiguration is changed to HttpResponseMessage.
  • UseRoutineDevelopmentMode is removed from Routine. You can now access it via developmentMode parameter in BusinessLogicConfigurer.Routine.
    businessLogic: c => c.Routine(developmentMode: builder.Environment.IsDevelopment())
  • Gazel WebApplication was renamed as AspNetCoreApplication.
  • IConfiguration was renamed as IFeatureConfiguration.
  • CustomWebApplication was removed. Use AspNetCoreApplication instead.
  • CustomClientApplication was removed. Use ClientApplication instead.
  • Obsolete application classes are removed.
    • GatewayApplication, MiddlewareApplication, ServiceApplication and ApiApplication were removed.
    • You can use corresponding extension methods such as services.AddGazelServiceApplication.
  • Obsolete methods are removed.
    • AddGazel<T> was removed, use AddGazel() instead.
    • WebService method in PatternsAndExtensions was removed. Use ApiPackage instead.
  • X509Certificate was removed. Use X509CertificateFromPem or X509CertificateFromP12File.
  • Support for one to one relation is removed.
  • Implicit Binary to byte[] conversion is not supported any more. Either use explicit conversion, or use ReadOnlyMemory<byte> as your variable type.
  • ILogManager, ILogger and LogLevel types are removed from Gazel package. You can use ILoggerFactory, ILogger, ILogger<T> and LogLevel types from Microsoft.Extensions.Logging.Abstractions.
  • LogLevel changes should be migrated to prevent build problems
    • Off and Info became None and Information respectively.
    • Module name of LogLevel in application model is changed from Gazel to Microsoft.
  • context.Logger is now obsolete, you might inject ILogger<T> or ILoggerFactory instead.
  • START_ORDER_MESSAGE_QUEUE, STOP_ORDER_MESSAGE_QUEUE, START_ORDER_LOGGER and START_ORDER_SERVICE are removed from Gazel.Constants
  • fetchEager is removed from CachedQuery and ILookupWithCache.
  • EnableLogging and DisableLogging in TestBase are renamed to EnableSqlLogs and DisableSqlLogs respectively, because it was only enabling NHibernate.SQL logger.

Improvements

  • Gazel.System project is renamed as Gazel.Primitives and published under a separate nuget package as Gazel.Primitives.
    • The namespaces of value types are still System. This has not changed. Only the project name has been changed.
  • Error was not logged during serialization of message data, fixed.
  • Facade classes removed. Below interface extensions are refactored as default interface methods;
    • LookupFacade -> ILookup,ILookupWithCache
    • ContextFacade -> IContext
    • ModuleContextFacade -> IModuleContext
    • SettingsFacade -> ISettings
    • StringToObjectConverterFacade -> IStringToObjectConverter
    • HasherFacade -> IHasher
    • RepositoryExtensions -> IRepository
    • SignatureVerifierFacade -> ISignatureVerifier
  • Crypto feature was defaulted to X509Store which is only available under windows. Now it is defaulted to AutoResolve which uses configuration to determine correct crypto option.
  • Data access layer now validates that every persistent class has a corresponding query class.
  • Binary is optimized and made readonly by using ReadOnlyMemory<byte> as a backing field instead of byte[].
  • ILogger<T> can now be injected instead of injecting factory and creating logger in construcctor.
  • Logger category of a business object included product name even if it was configured otherwise, fixed.
  • MessageQueue feature is migrated to IHostedService
    • Added additional logging to inform about rabbit mq connection and queues.
  • IOnStopConfiguration is now bound to ApplicationStopped instead of ApplicationStopping.
  • Application model initialization is moved from OnStart to Build phase
  • Structs under Gazel.Primitives are now readonly.
  • Instead of appending log to console TestBase now provides an IAppender mock through MockSqlLogAppender property. This way unit tests are allowed to verify if a certain sql is logged and executed or not.
    • You have to enable sql logs via EnableSqlLogs() or BeginTest(enableSqlLogs: true).

Bugfixes

  • Failing delayed remote calls were causing scopes to fail after committing a new transaction, fixed.
  • New transaction on async void functions were not working due to incorrect overload resolution, fixed.

Library Upgrades

PackageOld VersionNew Version
Basic.Reference.Assemblies.Net501.2.4removed
Basic.Reference.Assemblies.Net60new1.4.1
coverlet.msbuild3.1.23.2.0
Microsoft.CodeAnalysis.CSharp4.2.04.4.0
Microsoft.Extensions.Logging.Log4Net.AspNetCore6.0.06.1.0
Microsoft.NET.Test.Sdk17.3.017.4.0
MySql.Data8.0.308.0.31
NHibernate5.3.125.3.14
NHibernate.Caches.CoreMemoryCache5.7.05.8.0
Npgsql6.0.66.0.7
NUnit3TestAdapter4.2.14.3.0
Routine0.9.66.1.0
Stubble.Core1.9.31.10.8
System.Data.SqlClient4.8.34.8.5
System.Data.SQLite10.0.115.510.0.116
System.Configuration.ConfigurationManager6.0.06.0.1

v5

v5.3.5

Bugfixes

  • Fetch eager was causing extra select in cached queries of cached entities that has non-cached parent, fixed.

v5.3.4

Improvements

  • Manual transaction check was not available within services. You can check if current context has a main transaction via context.TransactionalFactory.TransactionExists.
  • WithTransaction is provided to ensure a transaction exists for operations that require a transaction.
    • WithNewTransaction is to begin a new transaction even if there is one, WithTransaction begins only if current context does not have a transaction.

Bugfixes

  • Gazel.Cli was not working when generating from bin in windows, fixed.
  • ConsumeMessage was not sending RunSystemCall header, fixed.

v5.3.3

Bugfixes

  • Api assemblies were not included in application model, fixed.

v5.3.2

Bugfixes

  • Interface mapping (AnyStep) was causing an error during initialization when no implementation was found, fixed.

v5.3.1

Improvements

  • Repository structure changes are made
    • Source and Test folders are renamed as src and test
    • Repository is renamed from Gazel to gazel
    • master branch is renamed to main
  • Binary now has implicit operators to & from ReadOnlyMemory<byte> as well as byte[]

Library Upgrades

  • Added package references that were reported to be missing
  • Removed indirect package references
PackageOld VersionNew Version
Castle.LoggingFacility5.1.15.1.2
Castle.Windsor5.1.15.1.2
Castle.Windsor.Extensions.DependencyInjection5.1.15.1.2
CommandLineParser2.8.02.9.1
log4net2.0.122.0.15
FluentNHibernate2.1.23.1.0
Microsoft.CodeAnalysis.CSharp3.11.04.2.0
Microsoft.Extensions.Logging.Log4Net.AspNetCore5.0.46.0.0
Moq4.15.24.17.2
MySql.Datanew8.0.30
NHibernate5.2.75.3.12
Npgsql5.0.06.0.6
NUnit3.13.23.13.3
RabbitMQ.Client5.1.26.4.0
System.Buffersnew4.5.1
System.Configuration.ConfigurationManager5.0.06.0.0
System.Interaction.Asyncnew6.0.1

This is a patch release because packages are updated with the intention of not causing a breaking change, and new version is tested in all sample projects with no breaking or behavioral change observed.

However, if your application has a custom feature or configuration built with the previous version of these packages (especially NHibernate, FluentNHibernate and RabbitMQ.Client), it is possible for your application to encounter a breaking change and fail to build.

v5.3.0

Features

  • Message queue event model is completely redesigned. You can now add listeners to message queue events to keep track of the status of messages.

Breaking Changes

  • MessageStatus, IMessage, IMessages and IMessageManager types under Gazel.MessageQueue namespace are removed.
  • SendMessage service is removed from RabbitMqQueueManager class. Now it has ConsumeMessage service with body parameter.

Improvements

  • Max daily count limit was obligatory in AuditOption, now it is optional via limitDailyCount parameter
    • Use audit: c => c.Enabled(limitDailyRequest: false) to disable daily request limit
  • Max daily count was creating new transaction each time it checks the limit, now it uses existing transaction when main transaction is available
  • Add int constraint to all {id} route parameters in standard routes, now they are all {id:int}
  • Application assemblies access is now available in legacy Global usages
  • Polymorphic mapping (a.k.a. AnyStep) now tolerates enum members without an implementation class

Bugfixes

  • Not detecting route parameter constraints in route templates (e.g. {id:int}), fixed
  • Nullable value types in Rest API were not rendered correctly, fixed

v5.2.0

Features

  • Support for async / await has arrived!
    • async services are marked as Async
    • context.Remote has three different overloads
      • use Do to make sync calls to sync services
      • use await Do to make async calls to async services
      • use await DoAsync to make async calls to sync services
    • context.WithNewTransaction has three differrent overloads
      • use Do to make sync transactions with sync functions
      • use await Do to make async transactions with async functions
      • use await DoAsync to make async transaction with sync functions
    • Client Api generates Async and Sync overloads
      • sync service -> sync & async client
        • void Do() -> void Do() & Task DoAsync()
      • async service -> sync & async client
        • Task Do() -> Task Do() & void DoSync()
        • Task DoAsync() -> Task DoAync() & void Do()
      • sync & async service -> sync & async client
        • void Do() & Task DoAsync() -> void Do() & Task DoAsync()
    • context.File has async overloads for write, read and append
    • Commands in client applications are now async
  • Add [ManualTransaction] to prevent automatic db connection and transaction. This switch will improve performance when a service makes an external http request before doing db related work or no db related work at all.
    • Transaction is still available using context.WithNewTransaction.
  • Gazel CLI now is released as a dotnet tool. Run dotnet tool install -g Gazel.Cli to use it.

Breaking Changes

  • Client Api doesn't have CurrentThread request scope any more, use AsyncLocal instead
  • Gazel CLI is not in Chocolatey any more, but previous releases are still there.

Improvements

  • Gazel documentation redesigned and restructured completely
  • NuGet package dependencies are fixed, they are listed as package dependency instead of including external .dll files
    • Gazel.Configuration now depends on Gazel
    • Removed unnecessary dependency to System.ServiceModel.Primitives
  • CI/CD is migrated from an internal Jenkins server to GitHub Actions

Bugfixes

  • Projects were missing several dependencies, fixed
  • Gazel.Cli wasn't working on dotnet tool, fixed

v5.1.0

Features

  • Business services can now be async

Breaking Changes

  • IApiGenerationConfiguration is renamed to IRestApiConfiguration

Improvements

  • Rest Templates are completely refactored!
    • Accepts different naming conventions for route, query, form and body parameters
    • Has additional default routes
    • Offers a simpler configuration for custom routing, status code mapping and more
    • Logs all route configurations on start

v5.0.0

Features

  • Gazel now supports .NET 5!
  • New commands to Gazel CLI
    • codegen: With g codegen you can generate source code instead of generating an assembly (.dll) file
    • schemagen: With g schemagen you can save schema file to a .json file
      • apigen and codegen has --schema-file option to be able to use a local schema file
  • Gazel CLI now accepts a backup-uri to use when given uri fails during apigen or codegen or schemagen

Breaking Changes

  • .NET Framework is not supported any more
  • Below features are removed and not supported any more;
    • ASP.NET MVC, WCF, WebApi, Vue are not supported any more
    • WebService namespace is removed completely, Rest template is in RestApi namespace
    • IdObfuscation is removed completely
    • Quartz Scheduler is removed completely
    • Report feature is removed completely
    • Stub feature is removed completely
    • IServiceResultData is removed
    • TriState removed, use bool? instead
    • IOnBeginRequestConfiguration and IOnEndRequestConfiguration are removed. Use ASP.NET Core IHostApplicationLifetime object to register begin end events;
  • Various renamings are done;
    • Configurers namespace is renamed to Features. Changing your usings in Global class of your application will be sufficient.
    • HttpApplication is renamed to WebApplication
    • WebServiceApplication is renamed to ApiApplication
    • IWebServiceConfiguration is renamed to IApiGenerationConfiguration
    • FromConfig helpers in application classes are renamed to Setting
    • TokenBased authentication is renamed to BearerToken
    • NoAuthentication authentication is renamed to AllowAnonymous
    • NoAuthorization authorization is renamed to AllowAll
    • ModuleConfiguration is renamed to BusinessLogicConfiguration along with its configurer class.
  • Unit test projects does not use app.config any more, you should set root namespace using Config.RootNamespace in a static constructor of your test base or test fixture classes.
  • RabbitMQ implementation does not feed a log table (e.g. QueuedServiceRequestLog) any more
  • Configurer now only returns IClientContext, you have to use it to create a client api class
  • Kernel registration logs are not appended any more. To see them again, change log level of Gazel.Configuration.Layers.IoCLayer logger to Debug.
  • Web service packages does not include a virtual Ping method any more

Improvement

  • ISettings is registered to Kernel immediately so that Config helper functions (former FromConfig) can get settings value during configuration in Global files.
  • Application assemblies can now be overridden using applicationAssemblies parameter in application builders, Assemblies class or ApplicationAssemblies property in application base classes.

Bugfixes

  • Nullable parameters were not supported as inputs, fixed

v1

v1.2.2

Improvements

  • Fixes an issue that caused a serious slow down on application init

Bugfixes

  • Client api generation from local was not working because of missing assemblies, fixed
  • Mvc hosts with client api was not starting, fixed

v1.2.1

Features

  • apigen now can create client api from bin directory

Improvements

  • apigen now shows compile errors in console output

Bugfixes

  • apigen was not deleting temp folder when an error occurs, fixed

v1.2.0

Features

  • "Gazel CLI" is introduced as a global tool (g). Install it through choco install gazel-cli.
  • CommandLineApplication is introduced as a new application type which supports verb and option parsing via CommandLineParser
  • IComponentModelBuilderConfiguration is introduced to enable modifying default registration of components.
    • LifestyleContributor is implemented to enable changing registered lifestyle of a component. (e.g. cmb.SetLifeStyle(of: typeof(SomeClass), to: LifestyleType.Singleton))
    • OrderedInterceptorContributor is implemented to allow ordered interceptors from "Castle.Windsor".
  • ColoredLevelConsoleAppender is added to allow beautiful log messages to console.

Breaking Changes

  • apigen.exe is removed from "Gazel.Client" package and moved to "Gazel CLI" as a sub command (e.g. g apigen http://api.project.com -n MyCompany.MyProject)
  • apigen options are redesigned completely
  • singleton parameter of TestBase.CreateMock is renamed to @override
  • DateTimeRange.DateTimeFormat field is renamed to DATE_TIME_FORMAT and made private, you can use Constants.DATE_TIME_FORMAT instead
  • Default color style is ColorStyle.Gray for MVC Public Theme

Improvements

  • Missing XML documentation of Gazel.System classes are completed
  • A lot of refactoring was made to improve code readibility
  • Nuget specs are revised to conform to best practices
  • ColorStyle.Gray added to MVC Public Theme
  • Added FileSystem feature to MVC applications

Bugfixes

  • SQLite.Interop assemblies will be added with CopyIfNewer set to TRUE
  • 3rd party library XML documentation files are included in nuget packages
  • MVC DecimalPointOption.Always was not working correctly, fixed

v1.1.9

Bugfixes

  • SessionInfo columns are excluded from CustomerUserType naming convention like audit columns.

Improvements

  • In order to store session information like AuditInfo on entities, SessionInfo is added. IWithSession and IAuditableWithSession interfaces are added to enforce user to use as properties.

v1.1.7

Improvements

  • Npgsql is added to Gazel.Configuration in order to support PostgreSQL.

v1.1.6

Improvements

  • Instead of fetching fonts from google, Google Fonts in gazel.css are embeded into Gazel.Configuration.Mvc
  • Submodules of Acelang are embeded into Gazel.Configuration.Mvc

v1.1.4

Bugfixes

  • The maxResultLengthInBytes specified using the ServiceConfigurer in Global.asax for GateWay Application is not set on the JavaScriptSerializer.MaxJsonLength property. It gives "The length of the string exceeds the value set on the maxJsonLength property" error message, fixed.

v1.1.3

Library Upgrades

PackageOld VersionNew Version
Routine0.8.10.8.2

v1.1.2

Bugfixes

  • The maxResultLengthInBytes specified using the ServiceConfigurer in Global.asax is not set on the JavaScriptSerializer.MaxJsonLength property. It gives "The length of the string exceeds the value set on the maxJsonLength property" error message, fixed.

v1.1.1

Bugfixes

  • License keys with MvcApplication were not working under ServiceApplication, fixed.

Library Upgrades

PackageOld VersionNew Version
Routine0.8.00.8.1

v1.1.0

Features

  • Nuget - The Nuget packages were arranged.
    • Created Gazel.Configuration.Mvc NuGet package to support MVC web applications on .NET Framework.

Breaking Changes

  • MVC web application support has been removed from Gazel.Configuration. It has been moved to the new Gazel.Configuration.Mvc NuGet package.
  • Auto UI support has been removed from Gazel.Configuration. It has been moved to the new Gazel.Configuration.Mvc NuGet package.
  • Microsoft.AspNet.Mvc NuGet package has been removed from both Gazel and Gazel.Configuration.
  • Newtonsoft.Json library has been removed from Gazel.Configuration NuGet package.

Improvements

  • Added json serializer support for Middleware Application

Library Upgrades

PackageOld VersionNew Version
Routine0.7.8.377950.8.0

v1.0.2

Library Upgrades

PackageOld VersionNew Version
Castle.Facilities.AspNet.SystemWeb5.0.05.0.1
Castle.LoggingFacility5.0.05.0.1
Castle.WcfIntegrationFacility5.0.05.0.1
Castle.Windsor5.0.05.0.1
Moq4.12.04.13.1
RabbitMQ.Client5.1.05.1.2

v1.0.1

Bugfixes

  • When context session is overriding, if an exception occurs in action, context session is not restored to previous value, fixed.
  • When an MVC application is started, action filters on UI modules are not automatically registered in kernel, fixed.
  • When a HTTP post request with content type application/x-www-form-urlencoded, REST api is throwing System.StackOverflowException, fixed.

Improvements

  • After NHibernate 5.1.2 upgrade, if an entity is mapped with explicit implementation of an interface, when accessing the Id property via an interface, it returns Id property of a proxy entity. That is expected behavior. But, NHibernate DefaultProxyFactory(obsoleted) was not doing this. It can still be enabled using useDefaultProxyFactory parameter of DatabaseConfigurer from Global.asax.
  • System.Threading.Tasks.Extensions library has been added in Gazel.Configuration NuGet package.

Library Upgrades

PackageOld VersionNew Version
Castle.Core4.3.14.4.0
Castle.Core-log4net4.3.14.4.0
Moq4.2.1402.2114.12.0
Newtonsoft.json12.0.112.0.2
NUnit3.11.03.12.0
System.Data.SQLite.Core 1.0.1101.0.1101.0.111

v1.0.0-rc3

Bugfixes

  • RemoteSyslogAppender doesn't properly handle newline in log message, fixed.

v1.0.0-rc2

Bugfixes

  • Fixed issue of not overriding what has been injected to already created objects with new mock objects when singleton is true create mock.

v1.0.0-rc1

Features

  • RabbitMQ now supports sending messages directly without implementing IMessageManager. It can be enabled using messageDeliveryStrategy parameter of MessageQueueConfigurer.RabbitMq from Global.asax.
  • Added json file localizer and custom localizer support. They can be configured using LocalizationFeature from Global.asax.
  • Sql reserved keywords can now be specified by configuring from Global.asax.
  • Documentation - Added PlantUML plugin inside Gazel documentation.
  • Documentation - Security and web service features have been published.

Breaking Changes

  • .Net Framework 4.0 support has been removed.
  • .Net Framework 4.5 is changed to 4.5.2.
  • Castle.FactorySupportFacility library has been removed from Gazel.Configuration nuget package.
  • For primary key, naming convention following EntityName+Id has been removed. It can now be specified using IMappingConfiguration implementation.

Improvements

  • Castle.Facilities.AspNet.SystemWeb 5.0.0, Remotion.Linq 2.1.2, Remotion.Linq.EagerFetching 2.1.0 and Antlr3.Runtime 3.5.1 libraries have been added in Gazel.Configuration nuget package.
  • NuGet package have been changed to provide support for .Net Framework 4.5.2 version.
  • Documentation - Architecture feature has been updated. (see: architecture )

Library Upgrades

PackageOld VersionNew Version
Castle.Core3.2.04.3.1
Castle.Core-log4net3.2.04.3.1
Castle.LoggingFacility3.2.05.0.0
Castle.WcfIntegrationFacility3.2.05.0.0
Castle.Windsor3.2.15.0.0
Common.Logging2.1.23.4.1
log4net1.2.102.0.8
NUnit2.6.33.11.0
Quartz2.2.43.0.7
RabbitMQ.Client3.5.75.1.0

Upgrades specific for .Net Framework 4.7

PackageOld VersionNew Version
FluentNHibernate1.4.02.1.2
NHibernate3.3.5.40005.1.2
NHibernate.Caches.SysCache3.3.3.40005.4.0

v0

v0.98.5

Features

  • For unhandled exceptions, request header and body can now be included in log message. It can be specified using UnhandledExceptionMessage method of LoggingFeature in Global.asax.
  • Context session can be changed using the IModuleContext.OverrideSession implementation at runtime.

Bugfixes

  • Fixed a bug with min value and max value on money data type for MS SQL Server. Money data type now correctly handles them.
  • Incorrect naming of data contract namespace in the WSDL which is generated by WCF data service, fixed. The namespace of data contract can now be specified using WebServiceConfiguration in Global.asax.

Improvements

  • Added CORS feature support for Mvc Service Client Application
  • Changed the execute order of Audit and Secure configuration interceptions.
  • Added System.Web.Http library in Gazel.Configuration nuget package.

v0.98.4

Features

  • Added following optional parameters allow you to use linq extension methods in your queries. (see: Conventions / Queries )
    • take
    • skip
    • orderBy
    • orderByDescending
    • any

Improvements

  • Service - Add support for refresh an entity's data from database. (IRepository<T>.Refresh(T entity))
  • System - Added a new system type that truncates long text.
  • Changed as protected accessibility of BuildQuery method in Query<T>

v0.98.2

Features

  • NuGet package have been changed to provide support for .Net Framework 4, 4.5, 4.6 and 4.7 versions.
  • Service - Root namespace is now detected automatically.
    • The assembly prefix to which Global.asax belongs is detected as the root namespace.
    • The root namespace can be specified by configuring it from Global.asax.
  • Documentation - The website of the Gazel has been published.
  • Documentation - A draft version documentation has been published.
  • Tools - An online tool for creating an empty project has been developed. (see: Setup / Create A Solution )
  • Web - Dropdown component for Enums was created.
    • It can be used as multiple choice.
    • Enum's text values are passed to localization and loaded into dropdown.
    • The icon and color for each item of the dropdown can be specified.
  • Web - The UI component of ContentValueType was created.

Bugfixes

  • Web - The last 2 hours, today and yesterday in the DateTimeRangePicker had incorrect date and time information, fixed.
  • Web - If the form is posted to the Nullable MoneyRange component without any values entered, the service returned the default MoneyRange value instead of null, fixed.

Improvements

  • Nuget - The Nuget packages were arranged.
    • Gazel package is now a single package. Dependencies of Gazel comes within Gazel to simplify nuget packages in projects.
    • apigen package is renamed to Gazel.Client
    • Apigen.exe has been removed from the project references. It was added under the Content folder in the project.
    • When the Gazel.Client package is installed, the apigen.exe readme file is opened.
  • Service - Exceptions within WithNewTransaction blocks were logged in ERROR level, changed to DEBUG.
  • Web - The library was changed to mask Money UI component.
  • Service - CreateDate and ModifyDate columns are now mapped to Timestamp.
  • Web - Allows to select currency in Money
    • If the default value is present, the default value is the currency. Otherwise, the Auto UI is retrieved from the configuration.
    • It can be gotton from Global.asax.
    • If the object has a property of type CurrencyCode, the currency value of the property is taken.
  • Service - ResultCode information is added to fail and success logs.
  • Web - Added 8-digit card number validation to CardNumber's UI component.
  • Service - More options in database connection;
    • Max pool size management for SqlServer connections
    • Oracle, PostgreSQL and MySql support
  • Web - Date constraint feature added to DatePicker UI component