2012-03-12 34 views
5

tôi có một nhà máy kho NhRepositoryFactoryLàm thế nào để tiêm một nhà máy của các loại chung với Autofac

public interface IRepositoryFactory 
{ 
    IRepository<T> Create<T>() where T: Entity; 
} 

public class NhRepositoryFactory: IRepositoryFactory 
{ 
    public IRepository<T> Create<T>() where T : Entity 
    { 
    return new NhRepository<T>(); 
    } 
} 

Để giải quyết một số kho phụ thuộc Tôi muốn để có được chúng từ container Autofac. Vì vậy, tôi bằng cách nào đó nên tiêm Func<IRepository<T>> nhà máy vào lớp học của tôi. Làm thế nào tôi có thể thực hiện điều này?
Cảm ơn bạn trước.

+0

Tại sao bạn không lưu trữ vùng chứa Autofac bên trong 'NhRepositoryFactory'? – Steven

+2

Tôi muốn nhà máy của tôi là Autofac-thuyết bất khả tri. –

+0

Nó chỉ chứa một dòng mã. Bạn có thể đặt nó bên trong thư mục gốc của bạn. Nó không phải là bất khả tri của container. – Steven

Trả lời

5

NhRepositoryFactory không chứa logic nghiệp vụ và có thể là một phần của gốc thành phần của bạn. Điều này cho phép bạn để cho nó có một tham chiếu đến container. This is just mechanics và không được coi là mẫu chống dịch vụ Định vị dịch vụ. Các NhRepositoryFactory sẽ trông như thế này:

// This class is part of your composition root 
public class NhRepositoryFactory : IRepositoryFactory 
{ 
    private readonly Container container; 

    public NhRepositoryFactory(Container container) 
    { 
     this.container = container; 
    } 

    public IRepository<T> Create<T>() where T : Entity 
    { 
     return this.container.Resolve<NhRepository<T>>(); 
    } 
} 

Và bạn có thể đăng ký nó như thế này:

+0

Tôi đồng ý có vẻ như không thể tránh khỏi để ghép đôi với Autofac bằng cách này hay cách khác. Tôi đã thực hiện nó theo cách bạn đề nghị. Sự khác biệt là tôi đã chuyển 'ILifetimeScope' thay vì' Container'. –

+0

Tôi đã thay đổi cách triển khai. Tôi đã tạo giao diện 'IObjectFactory' với phương thức' T Create () 'sử dụng' ILifetimeScope' để tạo các đối tượng. Nó được thực hiện bởi lớp 'AutofacObjectFactory' được đưa vào' NhRepositoryFactory'. Vì vậy, bây giờ không có khớp nối Autofac. –

+0

Sau khi tái cấu trúc «IRepositoryFactory' đã được loại bỏ. Vị trí của nó đã lấy 'IObjectFactory'. –

4

Autofac cũng có thể xử lý việc tạo ra generic natively mà không cần nhà máy.

builder.RegisterGeneric(typeof(NhRepository<>)) 
    .As(typeof(IRepository<>)) 
    .InstancePerLifetimeScope(); 

Sử dụng mẫu này bạn có thể chỉ cần phụ thuộc vào IRepository và autofac sẽ điền vào các phụ thuộc.

+1

Tôi đã thử nó theo cách này. Nhưng khi một số lớp cần nhiều kho lưu trữ, tôi phải thêm chúng làm tham số hàm tạo. Một lĩnh vực cho mỗi người trong số họ cũng được tạo ra. Nó có vẻ vụng về vì vậy tôi đã tạo ra một nhà máy. –

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