ModularSystem.Core 1.21.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package ModularSystem.Core --version 1.21.0
NuGet\Install-Package ModularSystem.Core -Version 1.21.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ModularSystem.Core" Version="1.21.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ModularSystem.Core --version 1.21.0
#r "nuget: ModularSystem.Core, 1.21.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install ModularSystem.Core as a Cake Addin
#addin nuget:?package=ModularSystem.Core&version=1.21.0

// Install ModularSystem.Core as a Cake Tool
#tool nuget:?package=ModularSystem.Core&version=1.21.0

ModularSystem Core (under development)

Build a solid basic CRUD within minutes

A library that takes care of the basic and boring stuff about creating web servers. The Modular System seeks to create a simple and modular way to automate the repetitive aspects of creating a regular web application.

Overview

This library is a group of usefull classes for daily delevopment, the goal is to always use the same code abstraction of a concept or idea, that way two diferent servers can communicate without using much, or any, specific adaptation layer. The interface exposed by one server can be parsed and understood without the need to map, type and adapt the data from the output, and that is only possible to do having a stable API model to use, that is what ModularSystem does. The 'Modular' comes from the idea to create specific modules to add functionalities to the application based on this stable interface model; the core library has some modules to add aditional features and code resusability. N|Solid

CRUD

  • Create and insert into database a new instance of a class
  • Get one document by ID or or many by search with filters
  • Update one document or many with one or multiple updates
  • Delete one document by ID

Generic Typing

The entity interface works with a generic type T where T inherts from a base class, that way the library can apply the dynamic CRUD to any class. Some methods are required to be implemented or overriten, that is where the application specific logic can be wired, such as validation and presentation.

Entity Interface

The entity interface is the CRUD foundation, it contains references to the validation logic and data access layer interface. It wires everything together to create the methods exposed by the entity.

  • To start you need to create the data structure that will be the entity model. It is important that this model implements the IQueryableBase interface. You can extend the model from QueryableBase to auto implement everything.

Example:

using ModularSystem.Core;

class User : QueryableBase
{
    public string Email { get; set; }
    public string Password { get; set; }
}

The IQueryableBase interface adds properties and methods that are used by the rest of the library, so don't forget to do that. Keep in mind that you can override almost everything and set the behaviour yourself.

  • A presented type for this model is also required, this presented type is what the library will use as I/O models to define the adapter layer.

Example:

//...
class PresentedUser 
{
    public string Email { get; set; }
}

Now you are all set to create the entity for this model.

  • The entity class must implement the IEntity<T> interface. The easy way is to extend from Entity<T> and implement the abstract interface.

Example:

using ModularSystem.Core;

class UserEntity : Entity<User>
{
    // ...
}

The entity requires, at least, the implementation of two interfaces and returning them from methods in the child class.

using ModularSystem.Core;

class UserEntity : Entity<User>
{
    protected IDAO<T> dao;
    protected IValidator<T> validator;
    
    public UserEntity()
    {
        dao = new UserDao();
        validator = new UserValidator();
    }
    
    public override IDAO<T> GetDAO() => dao;
    public override IValidator<T> GetValidator() => validator;
}

Data Access Object Interface (IDAO)

The IDAO interface is the part of the app where the code to access the database lives. It is all defined in a very abstract way, this is how entity interfaces with the I/O for a given resource.

Example:

using ModularSystem.Core;

public class UserDao : IDAO<User>
{
    // ...
}

The interface itself is really simple, implementing it is the real effort but, it will be done only once. The library ships with a MongoDB implementation of DAO, but you can write your own implementations like a PostgreDao class or a MySqlDao and so on.

public class UserDao : MongoDAO<User> 
{
    public UserDao(IMongoCollection<T> collection) : base(collection) 
    {
        // ...
    }
}

The IValidator<T> interface

The part of the app where you define the data validation for a given data structure. The validator defines a validation method that should throw exceptions in case the data is in an invalid state.

Example:

public class UserValdiator : IValidator<User> 
{
    // ...
}

Wiring it all together

Now that the entity has the implementations from those interfaces, it can be used by the another layer to create use cases. The entity enables writing clean code to define the desired behaviour.

public class MyUseCase 
{
    public void DoSomeStuff()
    {
        var entity = new UserEntity();
        var user = new User();
        var task = entity.CreateAsync(user);
    }
    
    public void DoSomeMoreStuff()
    {
        var entity = new UserEntity();
        var context = RequestContext.System();
        var request = new SearchRequest(context);
        var filter = new SomeFilter();
        request.AddFilter(filter);
        var task<IQueryList<User>> = entity.SearchAsync(request);
    }
}

You can create a basic crud ot of an entity implementation using the ApiController base class

the full namespace is ModularSystem.Web.ApiController, and it must implemente an bastract interface. The presented type here is the defined API for the app, generating GET, POST, PUT and DELETE methods for the resource.

ApiController<InnerType, OutterType> IAdapter<InnerType, OutterType>

The adapter work the same way, but you can adapt anything and have as many adapters as you like in the pipeline.

[Route("api/user")]
[ApiController]
public class UserController : ApiController<User, PresentedUser> 
{
    protected IEntity<User> entity;
    protected IAdapter<User, PresentedUser> adapter;
    
    public UserController(IAppContext appContext) : base(appContext.EnvToString())
    {
        entity = new UserEntity();
        adapter = new UserAdapter();
    }
    
    protected abstract IEntity<T> GetEntity() => entity;
    protected abstract IAdapter<T, PresentedT> GetAdapter() => adapter;
}

Define the adapter layer using the Adapter<TIn, TOut> class.

public class UserAdapter : Adapter<User, PresentedUser> 
{
    // TODO...
}

WORK IN PROGRESS ...

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on ModularSystem.Core:

Package Downloads
PlataformaOmega.IntegrationLibrary

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.40.0-prerelease.8 103 1/10/2024
1.40.0-prerelease.7 121 11/14/2023
1.40.0-prerelease.6 71 11/2/2023
1.40.0-prerelease.5 65 10/20/2023
1.40.0-prerelease.4 56 10/16/2023
1.40.0-prerelease.3 57 10/16/2023
1.40.0-prerelease.2 58 10/16/2023
1.40.0-prerelease.1 58 10/15/2023
1.39.1 164 9/28/2023
1.39.0 110 9/28/2023
1.38.2 109 9/27/2023
1.38.1 115 9/25/2023
1.38.0 120 9/19/2023
1.37.3 115 9/18/2023
1.37.2 84 9/18/2023
1.37.1 103 9/18/2023
1.37.0 134 9/13/2023
1.36.0 135 9/12/2023
1.35.6 124 9/12/2023
1.35.5 122 9/12/2023
1.35.4 132 9/11/2023
1.35.3 124 9/7/2023
1.35.2 107 9/6/2023
1.35.1 131 9/6/2023
1.35.0 130 9/6/2023
1.35.0-prerelease.42 78 8/31/2023
1.35.0-prerelease.41 67 8/31/2023
1.35.0-prerelease.40 80 8/30/2023
1.35.0-prerelease.39 71 8/30/2023
1.35.0-prerelease.38 79 8/29/2023
1.35.0-prerelease.37 78 8/27/2023
1.35.0-prerelease.36 72 8/26/2023
1.35.0-prerelease.35 66 8/26/2023
1.35.0-prerelease.34 70 8/26/2023
1.35.0-prerelease.33 63 8/26/2023
1.35.0-prerelease.32 70 8/25/2023
1.35.0-prerelease.31 80 8/25/2023
1.35.0-prerelease.30 65 8/25/2023
1.35.0-prerelease.29 71 8/25/2023
1.35.0-prerelease.28 70 8/25/2023
1.35.0-prerelease.27 65 8/25/2023
1.35.0-prerelease.26 68 8/25/2023
1.35.0-prerelease.25 66 8/25/2023
1.35.0-prerelease.24 71 8/25/2023
1.35.0-prerelease.23 74 8/24/2023
1.35.0-prerelease.22 71 8/24/2023
1.35.0-prerelease.21 71 8/23/2023
1.35.0-prerelease.20 66 8/23/2023
1.35.0-prerelease.19 65 8/23/2023
1.35.0-prerelease.18 74 8/19/2023
1.35.0-prerelease.17 66 8/19/2023
1.35.0-prerelease.16 73 8/19/2023
1.35.0-prerelease.15 67 8/18/2023
1.35.0-prerelease.14 72 8/16/2023
1.35.0-prerelease.13 71 8/16/2023
1.35.0-prerelease.12 74 8/15/2023
1.35.0-prerelease.11 81 8/14/2023
1.35.0-prerelease.10 81 8/13/2023
1.35.0-prerelease.9 76 8/13/2023
1.35.0-prerelease.8 86 8/9/2023
1.35.0-prerelease.7 87 8/2/2023
1.35.0-prerelease.6 84 8/2/2023
1.35.0-prerelease.5 84 8/2/2023
1.35.0-prerelease.4 71 8/2/2023
1.35.0-prerelease.2 110 8/1/2023
1.35.0-prerelease.1 90 7/25/2023
1.34.3 159 7/14/2023
1.34.2 172 7/11/2023
1.34.1 153 7/11/2023
1.34.0 121 7/11/2023
1.33.1 151 7/6/2023
1.33.0 156 7/6/2023
1.32.7 162 5/31/2023
1.32.6 206 5/31/2023
1.32.5 155 5/31/2023
1.32.4 150 5/31/2023
1.32.3 159 5/30/2023
1.32.2 200 5/30/2023
1.32.1 195 5/30/2023
1.32.0 143 5/26/2023
1.31.6 181 4/25/2023
1.31.5 178 4/25/2023
1.31.4 250 4/24/2023
1.31.3 189 4/21/2023
1.31.2 163 4/20/2023
1.31.1 114 4/14/2023
1.31.0 166 4/6/2023
1.30.0 113 4/4/2023
1.29.18 403 3/18/2023
1.29.17 307 3/18/2023
1.29.16 241 3/16/2023
1.29.15 241 3/16/2023
1.29.14 231 3/14/2023
1.29.13 493 3/9/2023
1.29.12 479 3/6/2023
1.29.11 250 3/3/2023
1.29.10 235 3/3/2023
1.29.9 326 3/2/2023
1.29.8 322 3/2/2023
1.29.7 567 3/1/2023
1.29.6 242 3/1/2023
1.29.5 321 2/27/2023
1.29.4 246 2/27/2023
1.29.3 258 2/25/2023
1.29.2 266 2/24/2023
1.29.1 278 2/24/2023
1.29.0 261 2/24/2023
1.28.4 246 2/22/2023
1.28.3 337 2/18/2023
1.28.2 260 2/18/2023
1.28.1 271 2/17/2023
1.28.0 408 2/16/2023
1.27.0 276 2/8/2023
1.26.3 274 2/7/2023
1.26.2 276 2/7/2023
1.26.1 272 2/7/2023
1.26.0 278 2/6/2023
1.25.21 282 2/4/2023
1.25.20 383 2/4/2023
1.25.19 283 2/4/2023
1.25.18 274 2/4/2023
1.25.17 266 2/3/2023
1.25.16 297 2/3/2023
1.25.15 278 1/28/2023
1.25.14 284 1/28/2023
1.25.13 303 1/27/2023
1.25.12 313 1/27/2023
1.25.11 440 1/27/2023
1.25.10 303 1/27/2023
1.25.9 385 1/20/2023
1.25.8 320 1/20/2023
1.25.7 318 1/20/2023
1.25.6 331 1/20/2023
1.25.5 307 1/20/2023
1.25.4 378 1/20/2023
1.25.3 321 1/20/2023
1.25.2 306 1/20/2023
1.25.1 309 1/19/2023
1.25.0 330 1/19/2023
1.24.4 533 1/13/2023
1.24.3 335 1/13/2023
1.24.2 313 1/13/2023
1.24.1 333 1/13/2023
1.24.0 320 1/13/2023
1.23.0 575 9/14/2022
1.22.0 471 8/27/2022
1.21.0 470 8/16/2022
1.20.1 489 8/4/2022
1.20.0 602 7/23/2022
1.19.3 513 7/8/2022
1.19.2 509 7/8/2022
1.19.1 911 7/7/2022
1.19.0 483 7/7/2022
1.18.10 630 7/6/2022
1.18.9 904 7/2/2022
1.18.8 483 7/2/2022
1.18.7 512 7/2/2022
1.18.6 507 7/2/2022
1.18.5 498 7/2/2022
1.18.4 487 7/2/2022
1.18.3 483 7/1/2022
1.18.2 507 6/28/2022
1.18.1 533 6/28/2022
1.18.0 479 6/27/2022
1.17.0 506 6/27/2022
1.16.8 536 5/16/2022
1.16.7 530 5/12/2022
1.16.6 543 5/10/2022
1.16.5 559 5/10/2022
1.16.4 529 5/10/2022
1.16.3 527 5/10/2022
1.16.2 554 4/30/2022
1.16.1 540 4/30/2022
1.16.0 538 4/30/2022
1.15.2 563 4/28/2022
1.15.1 533 4/27/2022
1.15.0 1,451 4/27/2022
1.14.8 554 4/1/2022
1.14.7 564 4/1/2022
1.14.6 564 4/1/2022
1.14.5 541 4/1/2022
1.14.4 587 3/27/2022
1.14.3 555 3/26/2022
1.14.2 561 3/25/2022
1.14.1 965 3/23/2022
1.14.0 534 3/23/2022
1.13.1 572 3/22/2022
1.13.0 547 3/22/2022
1.12.2 548 3/22/2022
1.12.1 732 3/22/2022
1.12.0 545 3/22/2022
1.11.2 579 3/11/2022
1.11.1 571 3/10/2022
1.11.0 551 3/10/2022
1.10.0 698 3/7/2022
1.9.2 593 3/3/2022
1.9.1 567 3/3/2022
1.9.0 1,629 2/26/2022
1.8.3 561 2/26/2022
1.8.2 574 2/1/2022
1.8.1 584 1/24/2022
1.8.0 586 1/24/2022
1.7.1 629 1/19/2022
1.7.0 589 1/19/2022
1.6.0 586 1/19/2022
1.5.0 603 1/19/2022
1.4.3 483 1/14/2022
1.4.2 496 1/14/2022
1.4.1 606 1/13/2022
1.4.0 487 1/13/2022
1.3.0 626 1/12/2022
1.2.0 486 1/11/2022
1.1.3 497 1/11/2022
1.1.2 475 1/11/2022
1.1.1 490 1/11/2022
1.1.0 487 1/11/2022

New Features.