Tôi đang cố gắng tìm hiểu cách sử dụng IoC trong các tình huống mà các lớp phụ thuộc có thể thay đổi dựa trên một số biến trong ứng dụng trường hợp, Trạng thái phiên). Ví dụ, mỗi khách hàng của chúng tôi có một cơ sở dữ liệu khác nhau, vì vậy kết nối đến cơ sở dữ liệu cần được xây dựng trên một giá trị được lưu trữ trong phiên của họ (đặc biệt vì một số người dùng có thể có nhiều cơ sở dữ liệu nếu họ sở hữu nhiều doanh nghiệp và chuyển đổi giữa các cơ sở dữ liệu) .Cách thiết lập IoC khi một lớp khóa cần Session (hoặc biến ngữ cảnh cụ thể khác)
Dưới đây là một ví dụ chung chung về cách chúng tôi hiện đang muốn thiết lập cấu trúc này:
public class MyTestController : ControllerBase
{
Repository _rep;
public MyTest(Repository rep)
{
_rep = rep;
}
public MyTest()
{
string connString = String.Format("Server={0}; Database={1};"
, SessionContainer.ServerName, SessionContainer.DatabaseName;
var dc = new DataContext(connString);
_rep = new Repository(dc);
}
public int SampleFn()
{
return _rep.GetCountOfEmployees();
}
}
public class Repository
{
DataContext _context;
public Repository(DataContext context)
{
_context = context;
}
}
chúng tôi sẽ có thể thiết lập này bằng cách sử dụng IoC và loại bỏ những mặc định c-TOR? Nếu vậy, làm thế nào? Tôi không có vấn đề gì khi sử dụng D.I. như thế này, nhưng tôi muốn khám phá khả năng của một StructureMap hoặc Unity (lưu ý: chúng ta thường chuyển trong db/server tới một lớp nhà máy xây dựng datacontext ... ví dụ trên chỉ là ngắn gọn).
Đánh dấu - bạn có thể cụ thể hơn hoặc cung cấp ví dụ không? Chúng ta có thể có nhiều đối tượng kho lưu trữ, tất cả đều cần sử dụng cùng một DataContext (để xử lý giao dịch thích hợp). Tôi không có vấn đề đăng ký này trong container IoC khi "DataContext" sử dụng một chuỗi kết nối đó là toàn cầu hoặc được định nghĩa trong container, nhưng những gì về khi chuỗi kết nối là trong phiên của người dùng? Tôi cảm thấy như tôi đang thiếu một cái gì đó hiển nhiên. –
Đã thêm ví dụ vào câu trả lời của tôi. –
Ah ha, tôi nghĩ rằng tôi nhận được nó ngay bây giờ! =) Tôi đã bỏ phiếu cho bạn để tôi có thể thăng cấp bạn vào ngày mai để giành chiến thắng gấp đôi. Phản ứng tuyệt vời. –