L'architecture des applications d'entreprise peut être différente

image



Je suis agacé par l'architecture traditionnelle des applications métier - j'en ai déjà parlé. Je critique - je suggère. Maintenant, je vais vous dire où ma recherche de solutions aux problèmes de l'article précédent m'a conduit.



J'aime parcourir les concepts architecturaux. Toute ma vie, j'ai essayé de trouver quelque chose dans le domaine de l'architecture et de la conception de logiciels qui fonctionne et qui est en même temps simple. Il ne nécessite pas de rupture cérébrale pour la compréhension et un changement radical de paradigme. Beaucoup d'idées se sont accumulées et j'ai décidé de combiner les meilleures d'entre elles dans mon cadre - Reinforced.Tecture. Développer de telles choses est une énorme quantité de matière à réflexion, je veux les partager.



Les textes sur de telles choses techniques sont généralement terriblement ennuyeux. J'ai honnêtement essayé de ne pas être ennuyeux, donc mon texte s'est avéré légèrement agressif. Si vous souhaitez en savoir plus sur l'architecture des applications .NET avec ces règles, entrez.



Avertissement

. , , .



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



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



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


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



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



Systèmes externes



- : , — , - 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 .



, , . .



image



.




All Articles