Die Architektur von Unternehmensanwendungen kann unterschiedlich sein

Bild



Ich ärgere mich über die traditionelle Architektur von Geschäftsanwendungen - darüber habe ich bereits gesprochen. Ich kritisiere - ich schlage vor. Jetzt werde ich Ihnen sagen, wohin mich meine Suche nach Lösungen für die Probleme aus dem vorherigen Artikel geführt hat.



Ich iteriere gerne über architektonische Konzepte. Mein ganzes Leben lang habe ich versucht, etwas im Bereich Architektur und Software-Design zu finden, das funktioniert und gleichzeitig einfach ist. Es erfordert keine Unterbrechung des Gehirns zum Verständnis und einen radikalen Paradigmenwechsel. Viele Ideen haben sich angesammelt und ich habe beschlossen, die besten in meinem Framework zu kombinieren - Reinforced.Tecture. Solche Dinge zu entwickeln ist eine große Menge an Denkanstößen, ich möchte sie teilen.



Texte über solche technischen Dinge sind normalerweise furchtbar langweilig. Ich habe ehrlich gesagt versucht, nicht langweilig zu sein, daher stellte sich heraus, dass mein Text etwas aggressiv war. Wenn Sie mehr über die Architektur von .NET-Anwendungen mit diesen Regeln erfahren möchten, klicken Sie auf.



Haftungsausschluss

. , , .



: , , - . ( ), , — . . Tecture , . DevRel open source , . , , ( MIT-). , - — .



: . , , , . , . : , , , , , "-" . :



  • - Java (, C#) 80-90. — MS- eShopOnContainers, , - -. , peer review ;
  • . — , , .


"", "". — . , . , .NET.



: . , 100 UpWork- MVP. , , 30 15 . , , . , production-, -. node/react . , , . long term. " , " .



Externe Systeme



- : , — , - SalesForce. - , , , API . — -.



, — , . , , "-": , , . - — , .



: . , , . O/RM, SQL-. O/RM- . — INSERT- , . , , O/RM- : " ". , , . , . . — SaveChanges .



. , O/RM . , . — " " SQL, . , "object-relational impedance mismatch". . , : , . — , . , , . — . DBA - stored-.



. . : . , .



Tecture . , . , .



( )



, . , , . Tecture — , . — :



public interface Db { }


I .



CodeFest- - , , — " , HKT", . , .



C# type F# TypeScript, — interface . type — -, type inference . , C# HKT, reflection-.



( )



. . . . O/RM, SQL-. -, , , SQL . . , -.



"", "" — . , - . AOP . Tecture , , , ? , .



. C# . :



PM> Install-Package Reinforced.Tecture.Aspects.Orm
PM> Install-Package Reinforced.Tecture.Aspects.DirectSql


public interface Db :
        CommandQueryChannel <
                Reinforced.Tecture.Aspects.Orm.Command, 
                Reinforced.Tecture.Aspects.Orm.Query>,
        CommandQueryChannel <
                Reinforced.Tecture.Aspects.DirectSql.Command,
                Reinforced.Tecture.Aspects.DirectSql.Query>
    { }


, Tecture (, , ). by design . : netstandard2.0. — . .NET Core .



, ( ) -. , target framework netstandard2.0. . , Tecture .NET (: windows), .



, . - , .NET Framework, .



, SOLID, O/CP Separation of Concerns. .



— . , , . — . , , .



, -, . : separated contexts DDD, .



— . , - . : . - , Tecture. , .





— , -. . Tecture, :



//  
public class Orders : TectureService
    <                       
        Updates<Order>,     //    
        Adds<OrderLine>     //   OrderLine-
    >
{
    private Orders() { }    //    . 
                            // .   .  .

    //  - - -
    public void AddLine(int orderId, int productId, int quantity)   
    {   
        //      
        var order = From<Db>().Get<Order>().ById(orderId);          

        //    
        To<Db>().Update(order)                                      
            .Set(x => x.TotalQuantity, order.TotalQuantity + quantity);

        //   
        To<Db>().Add(new OrderLine {                                
            OrderId = orderId, 
            ProductId = productId, 
            Quantity = quantity});

        //     ,   
        Let<Products>().Reserve(productId, quantity);                

    }                       // .
}


, :



- IoC-. Let<Products>().(...) ( ). 90% IoC- ( ) , . runtime exception. , — . , .



Tecture -IoC . , . — ( ). Tecture , . . : , Tecture - .



- . , Tecture , . . : . , ISomethingService. . , — . , ( virtual ). , .



- , , . — dll-, , . . . internal , . , : , — . , . "domains", -.



-: . , . , -:



public class Orders : TectureService < Updates<Order>,  Adds<OrderLine> >
{


, . . Order- , OrderLine- ( ). , . , C# . , To<Db>().Delete(order) — , : ", , ".



. . Updates<> Adds<> ORM . , , . HKT — .



— . HKT , , -. god object-. , , , . . — TectureService , 10 . , .



-: "Service". — . .



Let<>. ? , : Tecture IoC- ITecture ( ). ITecture TectureBuilder . , . , . .



, ITecture Let<>(), . : tecture.Let<Orders>().CreateOne(...), ITecture .



? , ( protected):



  • Let<TService>(), . . -: Do<>. , -.
  • From<TChannel>(): , . , , ITecture;
  • To<TChannel>(): , . , ;


From<> To<> .





EntityFramework: . LINQ, SQL, , , IQueryable. ! - , -. , .Add, .Remove — … . — SaveChanges, SQL . . EF- ChangesTracker, diff, " , — " — .



— . -. , Read, Write. .



. ? - - ( ), , , . - .



— . -, , , , 10 , , ? — - .



. . , CQRS, , MediatR, DDD, "Entity Framework Core in Action" - . , . Microsoft — , , . Microsoft MVC, Model, View Controller. web-, HttpRequest HttpResponse. , , . . .



Tecture : , — .



( )



— From<>.



: Tecture , — . — . . Tecture — . .



: , concern- . SELECT . . , , — . Repeatable Read. : , , , , - . C# .



fake-, Repository Pattern . . Tecture , : " " , . , — , - . . : GetSomethingById, :



//     Id-
public interface IEntity { int Id {get;} }

//    IQueryable ()
public interface IQueryFor<T> 
{ 
    IQueryable<T> All { get; } 
    IQueryable<U> Joined<U>(); 
}

public static class Extensions
{

    //    IQueryFor    
    public static IQueryFor<T> Get<T>(this Read<QueryChannel<Orm.Query>> qr) where T : class
    {
        //       
        var pr = qr.Aspect();
        //     
        return new QueryForImpl<T>(pr);
    }

    //  ById    IQueryFor<T>,  T  int- Id
    public static T ById<T>(this IQueryFor<T> q, int id) where T : IEntity
    {
        return q.All.FirstOrDefault(x => x.Id == id);
    }
}


, :



// , , 
var user = From<Db>().Get<User>().ById(10);


- — LINQ, fluent-, , .



( )



— From<>(). / … , ? , To<>() . — , . — .



To<>() Write<...> -, . , . .Add. . .Add — . — .



. . Tecture Add, .



: - , , . , . EntityFramework. . .



EntityFramework, Save ITecture. .



? . . . , , exception- , . . , .



, . exception-, . . : - -, , , . , , , , -, e-mail- ( ). — , . .



, : . , - ? : , , Tecture . ( ORM-, Order ):



public async Task ILikeToMoveIt()
{
    var newOrder = To<Db>().Add(new Order());

    await Save;

    var id = From<Db>().Key(newOrder);
    To<Db>().Delete<Order>().ByPk(id);
}


Save- await. , !



, — . Save.ContinueWith(...).






Tecture , . . ( C#), . — .



, Tecture . Development Experience .



, , . .



Bild



.




All Articles