Tôi đang cố gắng giới thiệu DI (với Autofac) vào một ứng dụng Windows Forms hiện có.DI (Autofac) trong kiến trúc plugin: Có phải một vùng chứa DI riêng biệt cho mỗi trình cắm thêm OK không?
Ứng dụng này có kiến trúc trình cắm cơ bản trong đó mỗi plugin hiển thị biểu mẫu riêng. Khi khởi động, quét ứng dụng đăng ký lắp ráp với nhiều loại mà thực hiện IPlugin
, và sau đó kích hoạt những sử dụng Activator.CreateInstance
:
public interface IPlugin
{
Form MainForm { get; }
}
tôi không thể thay đổi khuôn khổ cho này. Điều này có nghĩa, mỗi lớp plugin được khởi tạo thông qua các phương tiện không phải DI, và có vẻ như với tôi rằng tôi sẽ phải khởi động một vùng chứa DI riêng biệt cho mỗi plugin.
Câu hỏi của tôi là, đang tạo riêng ContainerBuilder
và vùng chứa cho mỗi plugin OK và vẫn hợp lý hiệu quả? (Sẽ có khoảng 10 plugin khác nhau.) Hoặc chỉ nên có một vùng chứa DI cho toàn bộ ứng dụng?
Tôi đã cung cấp một số mã mẫu của giải pháp hiện tại của mình bên dưới.
using Autofac;
using System.Windows.Forms;
public class Plugin : IPlugin // instantiated by Activator
{
public Form MainForm { get; private set; }
public Plugin() // parameter-less constructor required by plugin framework
{
var builder = new ContainerBuilder();
builder.RegisterModule(new Configuration());
var container = builder.Build();
MainForm = container.Resolve<MainForm>();
//^preferred to new MainForm(...) because this way, I can take
// advantage of having dependencies auto-wired by the container.
}
}
internal class Configuration : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<MainForm>().SingleInstance();
// ... more plugin-specific registrations go here...
}
}
internal class MainForm : Form { /* ... */ }
Tôi cũng không chắc liệu tạo vùng chứa trong các nhà xây dựng plugin và sau đó chỉ cần quên về nó, nhưng để lại nó để làm tự động hệ thống dây điện ở chế độ nền, là OK?
Cảm ơn bạn đã trả lời, @Mark. Nếu tôi hiểu bạn một cách chính xác, mã ví dụ của tôi đã tuân theo mẫu RRR ... đúng không? (Ngoại trừ việc tôi không giải phóng container, vì nó cần phải sống sót ít nhất miễn là thành phần gốc 'MainForm'. Tôi cho rằng, cách lý tưởng để làm điều này là tạo các plugin' IDisposable' và phát hành các thùng chứa trong phương pháp 'Dispose'.) – stakx
Không có gì trong mã của bạn cho thấy rằng bạn không theo RRR, nhưng thật khó để nói. Trong mọi trường hợp, hãy nhớ rằng lối sống SingleInstance chỉ định nghĩa một Singleton chứa phạm vi chứa. Nó không phải là Singleton thực sự, vì vậy bạn không thể chia sẻ MainForm theo cách này. –