cuốn sách gpt4 ai đã làm

c# - Dịch vụ sở hữu Kho lưu trữ dùng một lần sở hữu DbContext dùng một lần - Vứt bỏ IDisposables được tiêm Unity

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 19:59:15 27 4
mua khóa gpt4 Nike

Tôi có một dịch vụ, một kho lưu trữ và một bối cảnh Db. Kho lưu trữ sở hữu bối cảnh Db, dịch vụ sở hữu kho lưu trữ.

Kho lưu trữ của tôi nên triển khai ID dùng một lần ? Nếu vậy thì dịch vụ của tôi cũng nên triển khai ID dùng một lần và vứt bỏ kho lưu trữ?

Tôi đoán một câu hỏi tổng quát hơn có thể là, nếu tôi có một lớp tham chiếu đến một lớp, tham chiếu đến một lớp khác,... (v.v.)..., tham chiếu đến tài nguyên dùng một lần không được quản lý hoặc được quản lý - liệu họ có nêntất cả实现ID dùng một lần?

câu trả lời hay nhất

Unity DI không thể loại bỏ các đối tượng khi chúng hết vòng đời và bạn không thể để chúng ở đó cho đến khi GC quyết định thu thập chúng.

Về mặt lý thuyết, có một khung DI thực hiện Đăng ký/Giải quyết/Phát hành là nơi xử lý được gọi, nhưng Unity không triển khai phần Phát hành. Tôi không biết có khung nào khác trong .NET có thể làm được điều này không.

Sử dụng Unity, có hai giải pháp:

1) Mẹo đơn giản

Đừng tiêm DbContext, thay vào đó hãy giải quyết nó từ vùng chứa khi cần thiết để bạn có thể kiểm soát việc xử lý nó

sử dụng(var ctx = container.Resolve())
{
}

Cảnh báo! Cảnh báo chống mẫu định vị dịch vụ

2) Giải pháp thông minh

Đưa vào một nhà máy cung cấp cho bạn DbContext khi bạn cần. Nếu bạn làm điều này, thay vì đưa vào DbContext, hãy đưa vào một lớp sẽ cung cấp cho bạn DbContext khi bạn cần: một nhà máy. Bạn có thể đăng ký nhà máy của mình dưới dạng đơn lẻ trong vùng chứa DI vì bạn sẽ sử dụng nó liên tục

sử dụng(var ctx = DbContextFactory.GetContex())
{
}

Nhà máy của bạn có thể trông như thế này:

lớp công khai DbContextFactory: IDbContextFactory
{
công khai DbContext GetDbContext()
{
...
}
}

Bằng cách này, nó có thể được tiêm thông qua việc tiêm hàm tạo:

MyService công khai(IDbContextFactory dbContextFactory)
{
}

Và, như đã đề cập trước đó, không có lý do gì để không đăng ký nó dưới dạng đơn lẻ: bạn có thể sử dụng cùng một nhà máy một cách an toàn và vui vẻ để xây dựng một số lượng lớn bối cảnh Db!

Lưu ý: Sẽ tốt hơn nếu bạn sử dụng một nhà máy trừu tượng, thay vì trả về một đối tượng cụ thể sẽ trả về một triển khai giao diện, đây là một thay đổi nhỏ

lớp công khai DbContextFactory: IDbContextFactory
{
IDbContext công khai GetDbContext()
{
...
}
}

Bạn có thể đọc phần này để biết thêm thông tin và ví dụ:

Về c# - Dịch vụ sở hữu Kho lưu trữ dùng một lần sở hữu DbContext dùng một lần - Vứt bỏ IDisposables được tiêm Unity, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/30081540/

27 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress