7

làm bất kỳ thùng chứa .NET IoC nào khác cung cấp chức năng tương đương cho cơ sở nhà máy đã nhập trong Castle Windsor?Nhà máy Castle Windsor Nhà máy được nhập tương đương

ví dụ: nếu tôi đang sử dụng một Abstract Factory trong một ứng dụng WPF:

public class MyViewModel 
{ 
    private IAnotherViewModelFactory factory; 

    public void ShowAnotherViewModel() 
    { 
     viewController.ShowView(factory.GetAnotherViewModel()); 
    } 
} 

Tôi không muốn phải tạo một cài đặt thủ công IAnotherViewModelFactory cho tất cả các loại ViewModel Tôi muốn hiển thị, tôi muốn các container để mất chăm sóc điều này cho tôi.

+0

Có vẻ như Ninject sắp sửa - http://stackoverflow.com/questions/8166696/how-to-use-a-factory-with-dependecy-injection-without-resorting-to-using-service/8167100# 8167100 –

Trả lời

6

AutoFac có một tính năng được gọi là Delegate Factories, nhưng theo như tôi có thể nói, nó chỉ hoạt động với các đại biểu chứ không phải giao diện.

tôi đã không gặp phải bất cứ điều gì tương tự như cơ sở Typed Factory Lâu đài trong không StructureMap cũng không Unity, nhưng điều đó không có nghĩa là họ không có ...


Cách duy nhất tôi có thể hãy tưởng tượng rằng một cái gì đó như thế này có thể được thực hiện cho các giao diện thông qua một proxy động. Kể từ Castle Windsor có một Proxy động, nhưng vài container khác có bất cứ điều gì tương tự, điều này có thể đi một chặng đường dài để giải thích lý do tại sao tính năng này không phải là phổ biến.

Unity cũng cung cấp khả năng chặn, do đó, nó phải có một số loại triển khai proxy động, nhưng tôi khá chắc chắn rằng nó không có bất kỳ điều gì tương đương với Nhà máy được đánh máy. So với các vật chứa khác, Unity khá cơ bản.

+0

Cảm ơn Mark, điều đó có nghĩa là bạn thường có tham chiếu đến vùng chứa trong mỗi lớp nhà máy nếu bạn không sử dụng Cơ sở nhà máy được đánh máy của Castle? – devdigital

+0

Không, điều đó có nghĩa là tôi chỉ cần mã hóa chúng theo cách thủ công.Nếu có quá nhiều, thì bạn có thể sử dụng Generics hoặc một số dạng tái sử dụng mã khác. –

+6

hoặc chỉ dính vào Windsor –

3

Trong Autofac, bạn có thể triển khai các nhà máy đã nhập trên phương pháp tiếp cận đại biểu Đánh dấu đề cập. Ví dụ.

class AnotherViewModelFactory : IAnotherViewModelFactory { 
    Func<AnotherViewModel> _factory; 
    public AnotherViewModelFactory(Func<AnotherViewModel> factory) { 
     _factory = factory; 
    } 
    public AnotherViewModel GetAnotherViewModel() { 
     return _factory(); 
    } 
} 

Nếu lớp này được đăng ký với container, cùng với AnotherViewModel Autofac sẽ cung cấp cho việc thực hiện Func<AnotherViewModel> ngầm:

builder.RegisterType<AnotherViewModel>(); 
builder.RegisterType<AnotherViewModelFactory>() 
    .As<IAnotherViewModelFactory>(); 

Thực tế bất kỳ giao diện, bạn có thể thực hiện bằng Typed Nhà máy cơ sở có thể được thực hiện trong Autofac sử dụng kiểu tiếp cận này. Sự khác biệt chính là việc thực hiện Windsor cấu hình nhà máy thông qua API đăng ký thành phần, trong khi ở Autofac nhà máy là một thành phần theo đúng nghĩa của nó.

Để biết các ví dụ phức tạp hơn, bạn có thể muốn xem: http://code.google.com/p/autofac/wiki/RelationshipTypeshttp://nblumhardt.com/2010/01/the-relationship-zoo/.

+0

+1, nhưng không nên thực hiện GetAnotherViewModel là 'return _factory();'? –

+0

Cảm ơn Mark, đã sửa! –

+1

Kỹ thuật này hoạt động chính xác theo cùng một cách trong Unity, nhân tiện. –

1

Gần đây tôi đã triển khai tương đương với Nhà máy Castle Windsor được nhập cho Unity. Bạn có thể tìm thấy dự án tại https://github.com/PombeirP/Unity.TypedFactories và gói NuGet theo số http://nuget.org/packages/Unity.TypedFactories.

Việc sử dụng như sau:

unityContainer 
    .RegisterTypedFactory<IFooFactory>() 
    .ForConcreteType<Foo>(); 

Việc kết hợp tham số được thực hiện theo tên, mà là tốt cho nhu cầu của tôi, mặc dù thư viện một cách dễ dàng có thể được mở rộng để hỗ trợ các nhu cầu khác.

Các vấn đề liên quan