Những ưu và nhược điểm của việc sử dụng Enterprise Library Unity so với các bộ chứa IoC khác (Windsor, Spring.Net, Autofac ..) là gì?
Những ưu và nhược điểm của việc sử dụng Enterprise Library Unity so với các bộ chứa IoC khác (Windsor, Spring.Net, Autofac ..) là gì?
Câu trả lời:
Tôi đang chuẩn bị một bài thuyết trình cho một nhóm người dùng. Như vậy tôi vừa trải qua một loạt chúng. Cụ thể: AutoFac, MEF, Ninject, Spring.Net, StructMap, Unity và Windsor.
Tôi muốn thể hiện 90% trường hợp (tiêm constructor, chủ yếu là những gì mọi người sử dụng IOC cho dù sao). Bạn có thể kiểm tra giải pháp tại đây (VS2008)
Như vậy, có một vài khác biệt chính:
Mỗi người trong số họ cũng có các tính năng khác (một số có AOP và gizmos tốt hơn, nhưng nói chung tất cả những gì tôi muốn một IOC làm là tạo và truy xuất các đối tượng cho tôi)
Lưu ý: sự khác biệt giữa truy xuất đối tượng thư viện khác nhau có thể được phủ định bằng cách sử dụng CommonServiceLocator: http://www.codeplex.com/CommonServiceLocator
Điều đó khiến chúng tôi khởi tạo, được thực hiện theo hai cách: thông qua mã hoặc thông qua cấu hình XML (app.config / web.config / custom.config). Một số hỗ trợ cả hai, một số chỉ hỗ trợ một. Tôi nên lưu ý: một số sử dụng các thuộc tính để giúp IoC hoạt động.
Vì vậy, đây là đánh giá của tôi về sự khác biệt:
Chỉ khởi tạo mã (có thuộc tính). Tôi hy vọng bạn thích lambdas. Mã khởi tạo trông như thế này:
IKernel kernel = new StandardKernel(
new InlineModule(
x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
x => x.Bind<ICustomerService>().To<CustomerService>(),
x => x.Bind<Form1>().ToSelf()
));
Mã khởi tạo hoặc XML hoặc các thuộc tính. v2,5 cũng rất lambda'y. Nói chung, đây là một trong những mục yêu thích của tôi. Một số ý tưởng rất thú vị xung quanh cách StructMap sử dụng các thuộc tính.
ObjectFactory.Initialize(x =>
{
x.UseDefaultStructureMapConfigFile = false;
x.ForRequestedType<ICustomerRepository>()
.TheDefaultIsConcreteType<CustomerRepository>()
.CacheBy(InstanceScope.Singleton);
x.ForRequestedType<ICustomerService>()
.TheDefaultIsConcreteType<CustomerService>()
.CacheBy(InstanceScope.Singleton);
x.ForConcreteType<Form1>();
});
Mã khởi tạo và XML. Thư viện đẹp, nhưng cấu hình XML là một nỗi đau ở mông. Thư viện tuyệt vời cho Microsoft hoặc các cửa hàng đường cao tốc. Mã khởi tạo rất dễ dàng:
container.RegisterType<ICustomerRepository, CustomerRepository>()
.RegisterType<ICustomerService, CustomerService>();
XML chỉ gần như tôi có thể nói. Nhưng đối với chức năng Spring.Net thực hiện mọi thứ dưới ánh mặt trời mà IoC có thể làm. Nhưng vì cách duy nhất để đơn vị hóa là thông qua XML nên các cửa hàng .net thường tránh. Mặc dù, nhiều cửa hàng .net / Java sử dụng Spring.Net vì sự giống nhau giữa phiên bản .net của Spring.Net và dự án Java Spring.
Lưu ý : Hiện tại có thể cấu hình trong mã với việc giới thiệu Spring.NET CodeConfig .
XML và mã. Giống như Spring.Net, Windsor sẽ làm bất cứ điều gì bạn có thể muốn nó làm. Windsor có lẽ là một trong những container IoC phổ biến nhất xung quanh.
IWindsorContainer container = new WindsorContainer();
container.AddComponentWithLifestyle<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");
Có thể trộn cả XML và mã (với v1.2). Thư viện IoC đơn giản đẹp. Có vẻ để làm những điều cơ bản với không nhiều phiền phức. Hỗ trợ các container lồng nhau với phạm vi cục bộ của các thành phần và quản lý thời gian sống được xác định rõ.
Đây là cách bạn khởi tạo nó:
var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
.As<ICustomerRepository>()
.ContainerScoped();
builder.Register<CustomerService>()
.As<ICustomerService>()
.ContainerScoped();
builder.Register<Form1>();
Nếu tôi phải chọn ngày hôm nay: tôi có thể sẽ đi với StructMap. Nó có sự hỗ trợ tốt nhất cho các tính năng ngôn ngữ C # 3.0 và linh hoạt nhất trong việc khởi tạo.
Lưu ý : Chris Brandsma đã biến câu trả lời ban đầu của mình thành một bài đăng trên blog .
Theo như tôi đã thấy thì chúng khá giống nhau, ngoại trừ một vài chi tiết thực hiện ở đây và đó. Ưu điểm lớn nhất mà Unity có được so với đối thủ là nó được cung cấp bởi Microsoft, có rất nhiều công ty ngoài kia sợ OSS.
Một nhược điểm là nó khá mới nên có thể có lỗi mà những người chơi cũ đã sắp xếp.
Đã nói rằng, bạn có thể muốn kiểm tra này .
Chủ đề cũ nhưng vì đây là điều đầu tiên mà Google chỉ cho tôi khi tôi nhập vào unity vs spring.net ...
Spring hiện làm CodeConfig nếu bạn không thích cấu hình XML
http://www.springframework.net/codeconfig/doc-latest/reference/html/
Ngoài ra, Spring không chỉ là một thùng chứa DI, nếu bạn nhìn vào phần 'Mô-đun' trong các tài liệu, thì thùng chứa DI là nền tảng của đống thứ khổng lồ mà nó làm.
Sửa lỗi cho tôi nếu tôi nhầm nhưng tôi nghĩ Autofac tự hỗ trợ Cấu hình XML như được liệt kê trong liên kết này: Cấu hình XML Autofac
Spring có một tính năng mà nó có thể đưa tham số vào hàm tạo hoặc thuộc tính dựa trên tên hoặc vị trí của tham số. Điều này rất hữu ích nếu tham số hoặc thuộc tính là một loại đơn giản (ví dụ: số nguyên, boolean). Xem ví dụ ở đây . Tôi không nghĩ rằng điều này thực sự bù đắp cho việc Spring không có khả năng cấu hình mã.
Windsor cũng có thể làm điều này, và có thể làm điều đó trong mã không cấu hình. (sửa tôi nếu tôi sai, tôi chỉ xem qua những gì tôi đã nghe ở đây).
Tôi muốn biết nếu Unity có thể làm điều này.
Một điều cần lưu ý: Ninject là bộ chứa IoC duy nhất hỗ trợ tiêm phụ thuộc theo ngữ cảnh (theo trang web của họ). Tuy nhiên, vì tôi không có kinh nghiệm với các bộ chứa IoC khác, tôi không thể biết liệu nó có giữ được không.
Chỉ cần thêm 2 xu của mình, tôi đã thử cả StructMap và Unity. Tôi tìm thấy StructMap là tài liệu kém / sai lầm, đau ở mông để cấu hình và sử dụng cồng kềnh. Tương tự, nó dường như không hỗ trợ các kịch bản như đối số của hàm tạo ghi đè tại thời điểm phân giải, đây là điểm sử dụng chính đối với tôi. Vì vậy, tôi đã bỏ nó và đi với Unity, và để nó làm những gì tôi muốn trong khoảng 20 phút.
Cá nhân tôi sử dụng Unity, nhưng chỉ vì nó là của Microsoft. Tôi lấy làm tiếc về quyết định này vì một lý do: điều lớn nhất mà nó chống lại nó có một "lỗi" lớn khiến nó liên tục ném ra ngoại lệ. Bạn có thể bỏ qua các ngoại lệ trong khi gỡ lỗi. Tuy nhiên, nó làm chậm ứng dụng của bạn rất nhiều nếu bạn chạy ngang qua nó, vì ném một ngoại lệ là một hoạt động tốn kém. Ví dụ: tôi hiện đang "sửa" ngoại lệ này tại một vị trí trong mã của mình, nơi các ngoại lệ của Unity thêm 4 giây vào thời gian kết xuất của trang. Để biết thêm chi tiết và cách giải quyết, xem:
Unity có thể được thực hiện để không ném đồng bộ hóa mọi lúc không?