Với một số vui lòng giúp đỡ từ StackOverflow, tôi đã có Unity Framework để tạo ra phụ thuộc xích của tôi, trong đó có một khung Entity DataContext đối tượng:khuôn khổ Unity - tạo & xử lý Entity Framework DataContexts tại thời điểm thích hợp
using (IUnityContainer container = new UnityContainer())
{
container.RegisterType<IMeterView, Meter>();
container.RegisterType<IUnitOfWork, CommunergySQLiteEntities>(new ContainerControlledLifetimeManager());
container.RegisterType<IRepositoryFactory, SQLiteRepositoryFactory>();
container.RegisterType<IRepositoryFactory, WCFRepositoryFactory>("Uploader");
container.Configure<InjectedMembers>()
.ConfigureInjectionFor<CommunergySQLiteEntities>(
new InjectionConstructor(connectionString));
MeterPresenter meterPresenter = container.Resolve<MeterPresenter>();
này hoạt động thực sự tốt trong việc tạo đối tượng Trình bày của tôi và hiển thị chế độ xem có liên quan, tôi thực sự hài lòng.
Tuy nhiên, vấn đề tôi đang gặp phải hiện nay là trong quá trình tạo và xử lý đối tượng Entity Framework (và tôi nghi ngờ điều này sẽ xảy ra với bất kỳ đối tượng IDisposable nào). Sử dụng Unity như thế này, các đối tượng SQL EF "CommunergySQLiteEntities" được tạo ra ngay lập tức, như tôi đã thêm giao diện của nó, IUnitOfWork đến constructor của MeterPresenter
public MeterPresenter(IMeterView view, IUnitOfWork unitOfWork, IRepositoryFactory cacheRepository)
{
this.mView = view;
this.unitOfWork = unitOfWork;
this.cacheRepository = cacheRepository;
this.Initialize();
}
tôi cảm thấy một chút khó chịu về điều này vào thời điểm đó, vì tôi không muốn giữ một kết nối cơ sở dữ liệu mở, nhưng tôi không thể nhìn thấy bất kỳ cách nào khác bằng cách sử dụng tiêm phụ thuộc Unity. Chắc chắn, khi tôi thực sự cố gắng sử dụng các DataContext, tôi nhận được lỗi này:
((System.Data.Objects.ObjectContext)(unitOfWork)).Connection
'((System.Data.Objects.ObjectContext)(unitOfWork)).Connection'
threw an exception of type 'System.ObjectDisposedException'
System.Data.Common.DbConnection {System.ObjectDisposedException}
sự hiểu biết của tôi về các nguyên tắc của IoC là bạn thiết lập tất cả các phụ thuộc của bạn ở phía trên, giải quyết đối tượng của bạn và lập tức bạn đi . Tuy nhiên, trong trường hợp này, một số đối tượng con, ví dụ datacontext, không cần khởi tạo tại thời điểm đối tượng Presenter cha được tạo (như bạn sẽ truyền chúng trong hàm tạo), nhưng Trình bày không cần biết về loại sử dụng cho IUnitOfWork khi nó muốn nói chuyện với cơ sở dữ liệu.
Lý tưởng nhất, tôi muốn một cái gì đó như thế này bên trong trình bày giải quyết của tôi:
using(IUnitOfWork unitOfWork = new NewInstanceInjectedUnitOfWorkType())
{
//do unitOfWork stuff
}
Vì vậy, trình bày hiểu biết những gì IUnitOfWork thực hiện sử dụng để tạo và xử lý ngay lập tức, tốt nhất từ cuộc gọi RegisterType gốc. Tôi có phải đặt một thùng chứa Unity khác bên trong Người trình bày của tôi, với nguy cơ tạo ra sự phụ thuộc mới không?
Điều này có thể thực sự rõ ràng đối với một guru IoC, nhưng tôi thực sự đánh giá cao một con trỏ đi đúng hướng.
Xin chào Aaron - bạn và Michael đều đúng, đó là một trình quản lý ContainerControlledLifetimeManager nhỏ bé mà tôi đã treo xung quanh từ một phiên bản trước. Tôi đã gỡ bỏ nó, quay trở lại để có IUnitOfWork trong constructor Presenter, và nó có vẻ đủ hạnh phúc. cảm ơn tất cả mọi người, rất giáo dục ... – TobyEvans
và lý do tôi đã có nó ở nơi đầu tiên là câu hỏi này: http://stackoverflow.com/questions/2412563/unity-framework-reusing-instance Tuy nhiên, tôi 've hiện nay đã thay đổi thiết kế của tôi sử dụng một nhà máy để tạo ra Repositories của tôi, và phương pháp nhà máy lấy IUnitOfWork như tham số: var localCache = cacheRepository.CreateRealtimeRepository (unitOfWork) vì vậy tôi không cần phải có ContainerControlledLifetimeManager Như tôi đã nói, rất giáo dục ... – TobyEvans