2011-09-27 43 views
28

Tôi biết Unity có thể được cấu hình để sử dụng một constructor của lớp để tạo một thể hiện của một lớp (như dưới đây) nhưng đó không phải là những gì tôi muốn.Cách tạo đối tượng bằng cách sử dụng phương pháp nhà máy tĩnh?

container.RegisterType<IAuthoringRepository, AuthoringRepository>(); 

Tôi muốn cấu hình Unity để sử dụng một phương pháp nhà máy với bản sắc cửa sổ thông qua như là một tham số (ví dụ: RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent())) khi giải quyết một loại IAuthoringRepository. Làm thế nào để tôi làm điều này?

Trả lời

46

Một cách là có RepositoryFactory triển khai IRepositoryFactory, sau đó đăng ký. Các loại được giải quyết có thể nhận được một nhà máy, sau đó gọi phương thức CreateAuthoringRepository của nó. Bạn có thể tạo một tình trạng quá tải được gọi là CreateAuthoringRepositoryForCurrentIdentity nếu muốn, hoặc đăng ký một phụ thuộc IIdentity của nhà máy với Unity.

Tôi có thể chỉ cần tiêm một nhà máy và rời khỏi phương thức CreateAuthoringRepository khi bạn có nó, sau đó có các máy khách vượt qua WindowsIdentity.GetCurrent(). Bằng cách đó, danh tính luôn tươi mới và bạn có thể thử nghiệm nhà máy để thử nghiệm.

Cách khác, bạn có thể chỉ định một đại biểu với InjectionFactory:

void Main() 
{ 
    using (var container = new UnityContainer()) 
    { 
     container.RegisterType<IAuthoringRepository>(
      new InjectionFactory(c => CreateAuthoringRepository())); 

     Console.WriteLine("debug - resolving model"); 
     var model = container.Resolve<Model>(); 
    } 
} 

public IAuthoringRepository CreateAuthoringRepository() 
{ 
    Console.WriteLine("debug - calling factory"); 
    return new AuthoringRepository 
     { Identity = WindowsIdentity.GetCurrent() }; 
} 

public class Model 
{ 
    public Model(IAuthoringRepository repository) 
    { 
     Console.WriteLine(
      "Constructing model with repository identity of " 
      + repository.Identity); 
    } 
} 

public interface IAuthoringRepository 
{ 
    IIdentity Identity { get; } 
} 

public class AuthoringRepository : IAuthoringRepository 
{ 
    public IIdentity Identity { get; set; } 
} 

in này:

debug - resolving model 
debug - calling factory 
Constructing model with repository identity of System.Security.Principal.WindowsIdentity

Đó là cho Unity 2.0. Với các phiên bản cũ hơn, hãy xem StaticFactoryExtension.

+1

Cảm ơn! làm việc như một say mê =) – burnt1ce

+1

Hoàn hảo! Điều này cũng phù hợp với tôi. –

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