thảo luận Thread dành cho anh em C#, .Net

  • Người tạo chủ đề Người tạo chủ đề BaronNashor
  • Ngày bắt đầu Ngày bắt đầu
Mình đang phát triển ứng dụng với AutoCAD .NET API sử dụng C#, mà mình mù mờ về Database của nó quá, có ai từng phát triển ứng dụng không.
 
Thím có thể share cái architecture thực tế được không, em có coi cái architecture của thằng aspnetboilerplate mà thấy nó hơi rối, không biết trong thực tế mọi người implement thằng microservice này sao :bad_smelly:

tôi chả phải muốn giấu diếm gì, nhưng đó là tài sản của công ty và dev ai cũng ký thỏa thuận bảo mật hết nên không share được thím à. Thông cảm nhé. Có vướng mắc gì thì hỏi cụ thể rồi anh em trao đổi thôi.
 
Trong Asp .Net Core thì khi register service của thằng EntityFramework mặc định life cycle của nó là Scope, cho mình hỏi là tại sao 1 thằng Service khác cần cái Dependency của thằng EntityFramework kia không nên Register kiểu AddSingleton? Mình có hiểu cái Life Cycle Scope với Singleton mà không tự giải thích được.

C#:
private readonly DataContext _dataContext;
public PostService(DataContext dataContext)
    {
        _dataContext = dataContext;
    }

//PostService cần dependency DbContext (Entity)
//Vì sao không nên register PostService như sau (Ở Startup class)
services.AddSingleton<IPostService, PostService>();

Capture.JPG
 
Sửa lần cuối:
Mình hay thêm cái này

C#:
 public void ConfigureServices(IServiceCollection services)
  {
            services.AddCors(options =>
            {
                options.AddPolicy("AllowAnyOrigin",
                    builder => builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader());
            });
  
     ...
}

   public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseCors("AllowAnyOrigin");
    
               ...
        }
À mình cũng dùng cái này nè, mà cái này không hiểu sao mình xài AllowAnyMethod thì cái Method Put nó chặn, báo lỗi CORS, còn GET với POST thì ok, không biết phải do IIS không nữa
 
Trong Asp .Net Core thì khi register service của thằng EntityFramework mặc định life cycle của nó là Scope, cho mình hỏi là tại sao 1 thằng Service khác cần cái Dependency của thằng EntityFramework kia không nên Register kiểu AddSingleton? Mình có hiểu cái Life Cycle Scope với Singleton mà không tự giải thích được.

C#:
private readonly DataContext _dataContext;
public PostService(DataContext dataContext)
    {
        _dataContext = dataContext;
    }

//PostService cần dependency DbContext (Entity)
//Vì sao không nên register PostService như sau (Ở Startup class)
services.AddSingleton<IPostService, PostService>();

Xem tệp đính kèm 25102

Không chỉ riêng gì Entity Framework mà tất cả các object trong C# lẫn Java đều không nên dùng Singleton nha thím. Ưu điểm duy nhất là code lẹ nhưng đẩy lên production nhiều request tí là tạch ngay. Thím tìm Singleton Pros and Cons trên google thấy đầy bài viết ngay.
 
Trong Asp .Net Core thì khi register service của thằng EntityFramework mặc định life cycle của nó là Scope, cho mình hỏi là tại sao 1 thằng Service khác cần cái Dependency của thằng EntityFramework kia không nên Register kiểu AddSingleton? Mình có hiểu cái Life Cycle Scope với Singleton mà không tự giải thích được.

C#:
private readonly DataContext _dataContext;
public PostService(DataContext dataContext)
    {
        _dataContext = dataContext;
    }

//PostService cần dependency DbContext (Entity)
//Vì sao không nên register PostService như sau (Ở Startup class)
services.AddSingleton<IPostService, PostService>();

Xem tệp đính kèm 25102

Khi một service được register theo kiểu scoped, tức là mình muốn mỗi request sẽ dùng riêng 1 instance của service đó để xứ lí. Vì nhiều request dùng chung 1 instance này có thể chạy sai.
Ví dụ, ở request thứ nhất, singleton service được sử dụng. Lúc này 1 instance của service này được khởi tạo cùng với việc khởi tạo của scoped service để truyền vào singleton service.
Khi request thứ 2 đến, single instance ở request thứ 1 được sử dụng lại mà ko cần khởi tạo. Trong instance này nó lại reference đến thằng scoped service được khởi tạo ở request thứ 1. Vậy là 2 request này đều dùng chung 1 instance của scoped service => Chạy sai.
 
Khi một service được register theo kiểu scoped, tức là mình muốn mỗi request sẽ dùng riêng 1 instance của service đó để xứ lí. Vì nhiều request dùng chung 1 instance này có thể chạy sai.
Ví dụ, ở request thứ nhất, singleton service được sử dụng. Lúc này 1 instance của service này được khởi tạo cùng với việc khởi tạo của scoped service để truyền vào singleton service.
Khi request thứ 2 đến, single instance ở request thứ 1 được sử dụng lại mà ko cần khởi tạo. Trong instance này nó lại reference đến thằng scoped service được khởi tạo ở request thứ 1. Vậy là 2 request này đều dùng chung 1 instance của scoped service => Chạy sai.
Hi bác cái bác giải thích em hiểu (Nó giống vs giải thích của MSDN) nhưng vấn đề là em chưa rõ trường hợp cụ thể như thế nào mà khi Singeleton service dùng Scoped Service mà có thể gây ra sai. Cái em không hiểu tại sao đây

Vậy là 2 request này đều dùng chung 1 instance của scoped service

Tại sao dùng chung instance của Scoped Service có thể gây ra sai nhỉ ? Giả sử với request 1 property của scoped service có gì đó thay đổi, thì khi đến với request 2, tuy là vẫn dùng chung object (Cụ thể là reference) thì property cũng được update cái thay đổi đó mà

//Vì thực sự việc dùng chung instance là giữ nguyên cái reference, còn thuộc tính của Scoped Service object vẫn luôn được update 1 cách đúng đắn nếu có thay đổi mà
 
Hi bác cái bác giải thích em hiểu (Nó giống vs giải thích của MSDN) nhưng vấn đề là em chưa rõ trường hợp cụ thể như thế nào mà khi Singeleton service dùng Scoped Service mà có thể gây ra sai. Cái em không hiểu tại sao đây

Vậy là 2 request này đều dùng chung 1 instance của scoped service

Tại sao dùng chung instance của Scoped Service có thể gây ra sai nhỉ ? Giả sử với request 1 property của scoped service có gì đó thay đổi, thì khi đến với request 2, tuy là vẫn dùng chung object (Cụ thể là reference) thì property cũng được update cái thay đổi đó mà

//Vì thực sự việc dùng chung instance là giữ nguyên cái reference, còn thuộc tính của Scoped Service object vẫn luôn được update 1 cách đúng đắn nếu có thay đổi mà

Ví dụ thím dùng entity framework để thực hiện thao tác dữ liệu trên database đi. Thím register DbContext theo kiểu scoped nhưng inject nó vào 1 singleton service. Ở request thứ nhất, thím gọi:
context.Set<Order>.Add(order);

Lúc này chỉ mới thêm order thôi, chưa gọi context.Save() để nó lưu xuống DB vì thím cần kiểm tra thêm 1 số thứ nữa trước khi lưu.

Song song lúc này, khi xử lí request 2, thím gọi

context.Set<Customer>().Add(customer);
context.Save();

Do context ở 2 request là cùng 1 instance. Nên trong khi xử lí request thứ 2, order lại vô tình được lưu xuống db luôn, mặc dù ở request 1, thím chưa kiểm tra nó xong. Lúc này là chạy sai rồi.
 
Ví dụ thím dùng entity framework để thực hiện thao tác dữ liệu trên database đi. Thím register DbContext theo kiểu scoped nhưng inject nó vào 1 singleton service. Ở request thứ nhất, thím gọi:
context.Set<Order>.Add(order);

Lúc này chỉ mới thêm order thôi, chưa gọi context.Save() để nó lưu xuống DB vì thím cần kiểm tra thêm 1 số thứ nữa trước khi lưu.

Song song lúc này, khi xử lí request 2, thím gọi

context.Set<Customer>().Add(customer);
context.Save();

Do context ở 2 request là cùng 1 instance. Nên trong khi xử lí request thứ 2, order lại vô tình được lưu xuống db luôn, mặc dù ở request 1, thím chưa kiểm tra nó xong. Lúc này là chạy sai rồi.
Nice quá thím ơi, cám ơn thím nhiều nhé :D Tiếc là chỉ cho được 1 ưng =))
 
Công ty hiện tại của tôi đang làm microservices đây, chỉ authenticate ở endpoint ngoài cùng thôi, sau đó dùng các api internal để xử lý tiếp, không authenticate/authorize nữa. Dùng jwt asp.net core bình thường thôi.

Giữa các service bác dùng cái gì để xác định user vậy ? Nếu vẫn dùng JWT giữa các service thì vẫn là kiểm tra authenticate tại các service mà
 
Hi bác cái bác giải thích em hiểu (Nó giống vs giải thích của MSDN) nhưng vấn đề là em chưa rõ trường hợp cụ thể như thế nào mà khi Singeleton service dùng Scoped Service mà có thể gây ra sai. Cái em không hiểu tại sao đây

Vậy là 2 request này đều dùng chung 1 instance của scoped service

Tại sao dùng chung instance của Scoped Service có thể gây ra sai nhỉ ? Giả sử với request 1 property của scoped service có gì đó thay đổi, thì khi đến với request 2, tuy là vẫn dùng chung object (Cụ thể là reference) thì property cũng được update cái thay đổi đó mà

//Vì thực sự việc dùng chung instance là giữ nguyên cái reference, còn thuộc tính của Scoped Service object vẫn luôn được update 1 cách đúng đắn nếu có thay đổi mà

Singleton = khi khởi chạy ứng dụng chỉ tạo 1 instance duy nhất
Scoped = 1 request sẽ khởi tạo 1 tập instance cho riêng request đó. Tạm hình dung là 1 request sẽ chiếm dụng 1 thread, các instance sẽ được khởi tạo trong thread này. Các request khác nhau sẽ sử dụng các instance khác nhau.
Lý do cần dùng scoped vì:
- EF không hỗ trợ multi thread, mặt khác EF sử dụng cơ chế tracking để theo dõi thay đổi của object mà nó manage => 2 thread dùng chung 1 DbContext sẽ dẫn đến dữ liệu bị sai
- Quá trình debug với dữ liệu cô lập sẽ dễ dàng hơn => hạn chế sử dụng Singleton
 
có cuốn clean code nào dễ đọc không mấy thím. Tiếng Việt càng tốt :D
 
Giữa các service bác dùng cái gì để xác định user vậy ? Nếu vẫn dùng JWT giữa các service thì vẫn là kiểm tra authenticate tại các service mà

Sorry giờ mới thấy post của thím.

Đơn giản các services đều có 2 dạng endpoints: ~/api/controller... và ~/api/internal/controller... Các authorize middleware sẽ bypass nếu request có dạng ~/api/internal/... và nginx sẽ block các request từ bên ngoài đến internal.
 
Chào các bác.
Sơ qua về em thì emđang là sinh viên năm 4 chuyên ngành điện - điện tử của 1 trường ở HCM,đang làmđồán tốt nghiệp.
Nhưng em không có nhiều kiến thức về chuyên ngành cũng không có hứng thú với ngànhđiện.
Thay vàođó em rất thích ngành lập trình,đếnnăm 4em mới nhận rađiềuđóạ.Em cũng tìm hiểu qua về lập trình thì nó rất rộng, em thích làm về lập trình web và ứng dụng cho window nên em học ngôn ngữ C# và thấy mình học nó cũng ổn ạ.
Lộ trình của em là học từ Basic -OOP-Winform- SQL Sever- .Net
Tư duy logic về toán học em cũng rất tốt .
Hiện tại emđang họcđược 1/2 OOP rồi .
Thời gian này em vừa tự học C# bên cạnhđó cũng làmđồán nữa,với tình hình dịch bệnh như hiện tại em cũng có thêm thời gian dài hơn cho việc học.
Nay em có 1 số thắc mắc mong các bác giải đáp giúp em với :
1. Emđịnh tốt nghiệp xong thì sẽ có bằng kĩ sư vềđiện tử, nhưng em sẽ apply vô những chổ tuyển C# thì cóđược khôngạ??
2. Thời gian đầu sau khi ra trường em sẽ học hỏi và làm về C#, sauđó sẽ tích lũy thêm kiến thức trong quá trìnhđó. Và gom tiềnđể hjc thêm văn bằng 2 công nghệ thông tin của trường KHTN HCM.
Thì bằng đó sẽ có tac dụng tương tự như bằng chính thứcđúng khôngạ??
3. Trong quá trình tự hoc thì em cần phải có những kĩ năng gì ?
Hiện tại thì em học những cú pháp cơ bản rồi, cũng làm 1 số bài tập cơ bản , nhưng khiđọc code mẫu thì 1 số chỗ, cú pháp không có như những gì emđã học làm em rât bối rối thì phải làm saoạ ?

CẢM ƠN MỌI NGƯỜI ĐÃ XEM =.=
 

Thống kê chủ đề

Ngày tạo
BaronNashor,
Người trả lời cuối
vuong222211,
Trả lời
266
Lượt xem
50.916
Quay lại
Lên đầu trang