2013-04-02 22 views
6

Nếu tôi sử dụng Mẫu Kho lưu trữ trong Ứng dụng ASP.NET MVC, tôi cần DI để cho chương trình biết, để giao diện các lớp phải được ánh xạ. Nếu tôi triển khai Unity, tôi cần thêm dự án DAL vào dự án MVC của tôi, và sau đó đăng ký các kiểu trong global.asax.ASP.NET MVC Project EF Repository Pattern

Trong suy nghĩ của tôi, tôi nghĩ rằng việc thêm không gian tên của lớp DAL vào dự án MVC là xấu, có một lớp nghiệp vụ ở giữa. Tôi nghĩ rằng, nó sẽ là đẹp để tiêm các lớp DAL trong lớp kinh doanh và chỉ ánh xạ lớp kinh doanh trong ứng dụng MVC.

Con đường để đến đây là gì? Bạn có gợi ý?

CẬP NHẬT: Để làm rõ cho tôi. Trong lớp dịch vụ, chỉ có DTO và DI cho lớp truy cập dữ liệu và doanh nghiệp. Trong lớp dịch vụ, tôi ánh xạ các DTO đến mô hình miền. Những gì tôi không hiểu là, làm thế nào tôi có thể gọi các phương thức lớp kinh doanh sau đó?

+0

Sử dụng repo không có nghĩa là bạn phải sử dụng DI - chúng giải quyết hai vấn đề khác nhau. –

+2

Tôi khuyên bạn nên đọc lên trên "kiến trúc hành tây", tôi nghĩ rằng đó là một cách tiếp cận tốt để tham khảo dự án. Bởi vì các lớp UI và DataAccess của bạn sẽ ở ngay bên ngoài, nên không có bất kỳ vấn đề gì để chúng tham chiếu lẫn nhau. – Charlino

Trả lời

3

Thậm chí nếu bạn không sử dụng một lớp dịch vụ riêng biệt, bạn có thể thực hiện những gì bạn muốn, đó là tách ứng dụng MVC khỏi dự án DAL bằng DI.

Cách để làm điều này là thêm một vài dự án/hội đồng ở giữa các dây dẫn lên thùng chứa IoC của bạn với các trường hợp cụ thể của giao diện mà bạn đã xác định.

Tôi thường sử dụng quy ước đặt tên này:

  • MyCompany.MyProject.Infrastructure

  • MyCompany.MyProject.Abstract

dự án MVC chính của bạn sau đó sẽ có một tham chiếu đến các dự án Tóm tắt và Cơ sở hạ tầng của bạn. Dự án cơ sở hạ tầng của bạn sẽ có một tham chiếu đến các dự án Tóm tắt và các cá thể cụ thể như các dự án Kinh doanh và DAL. Trong dự án cơ sở hạ tầng bạn dây lên các phụ thuộc.

Bạn sẽ phải thiết lập một cơ chế cho dự án MVC của mình để khởi động IoC của bạn trong hội đồng Cơ sở hạ tầng. Bạn có thể làm điều đó trong global.asax của bạn hoặc như một phương thức App_Start và gọi một lớp Registration trong cơ sở hạ tầng của bạn.

Chúng tôi sử dụng StructureMap, nhưng khái niệm này giống nhau. Đây là một số mã mẫu.

Trong ứng dụng MVC của bạn, hãy tạo phương thức App_Start để thiết lập DI.

public static class StructuremapMvc 
{ 
    public static void Start() 
    { 

     // Create new Structuremap Controller factory so Structure map can resolve the parameter dependencies. 
     ControllerBuilder.Current.SetControllerFactory(new StructuremapControllerFactory()); 

     IContainer container = IoC.Initialize(); 

     DependencyResolver.SetResolver(new StructureMapDependencyResolver(container)); 

     GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container); 
    } 
} 

Trong lắp ráp cơ sở hạ tầng của bạn, kết nối phụ thuộc.

public static class IoC 
{ 
    public static IContainer Initialize() 
    { 
     ObjectFactory.Initialize(x => 
        { 
         x.Scan(scan => 
           { 
            scan.TheCallingAssembly(); 
            scan.WithDefaultConventions(); 
           }); 
         x.For<IRepositoryNum1>().Use<Num1Repository>(); 
         x.For<IRepositoryNum2>().Use<Num2Repository>(); 
         x.For<IRepositoryNum3>().Use<Num3Repository>(); 
        }); 

     return ObjectFactory.Container; 
    } 
} 
+0

Ok, cơ sở hạ tầng này giống như lớp dịch vụ được mô tả bởi Alwyn, nhưng không có DTO, tôi có đúng không? Cách tiếp cận này trông rất tốt với tôi, tôi sẽ kiểm tra nó. – Dominik2000

+0

Có, phương pháp này có thể được sử dụng có hoặc không có một lớp dịch vụ và các DTO liên quan. – dblood

4

Nếu bạn muốn thực dụng, kiến ​​trúc 3 tầng thực sự yêu cầu một lớp dịch vụ. Giữa dịch vụ và MVC là các đối tượng chuyển dữ liệu (DTO). Lớp dịch vụ ẩn cả DAL và lớp nghiệp vụ.

Nếu bạn thiết lập nó như thế này, bản thân MVC không biết gì về DAL, chỉ DTO và Dịch vụ (hợp đồng).

+0

Đây sẽ là cách tiếp cận của tôi –

+0

OK, tôi sẽ kiểm tra cả hai phương pháp. Tôi sẽ thấy những gì phù hợp hơn cho tôi. – Dominik2000

0

Bạn nên sử dụng DI để chèn giao diện Domain/DAL vào các nhà thầu của bạn. Điều này có rất nhiều lộn ngược bao gồm cho phép bạn moq giao diện của bạn khi bạn viết các bài kiểm tra đơn vị của bạn. Bạn có thể sử dụng Autofac để xử lý việc tiêm.

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