MVC 3: การฉีดที่เก็บข้อมูลหลายรายการลงในคอนโทรลเลอร์ตัวเดียว

เลเยอร์การนำเสนอของฉันอยู่ใน MVC 3

ฉันมีชั้นการเข้าถึงข้อมูลที่ส่งคืนที่เก็บข้อมูล แต่ละที่เก็บถูกแมปกับตารางเดียว

ตัวอย่างเช่น ฉันมีอินเทอร์เฟซที่เก็บข้อมูลต่อไปนี้:

  • ICustomerRepository
  • ICustomerTypeRepository

ฉันมีการใช้งาน Entity Framework ของที่เก็บเหล่านี้ การใช้งานเหล่านี้ได้รับการฉีดเข้าไปในรันไทม์ด้วย Ninject

ฉันมีตัวควบคุมสองตัว:

  • ลูกค้าคอนโทรลเลอร์
  • ตัวควบคุมประเภทลูกค้า

คอนโทรลเลอร์แต่ละตัวมีชุดรูทีน CRUD ลูกค้าจะต้องมีแบบ

ในการสร้างบันทึกลูกค้า ฉันต้องใช้ EFCustomerTypeRepository

ตอนนี้ฉันมี Constructor ภายใน CustomerController ซึ่งมีลักษณะดังนี้:

public class CustomerController: Controller
{
   private ICustomerRepository customerRepository;        
   private ICustomerTypeRepository customerTypeRepository; 

   public CustomerController(ICustomerRepository customerRepository, 
                             ICustomerTypeRepository customerTypeRepository)
   {
      this.customerRepository = customerRepository;            
      this.customerTypeRepository = customerTypeRepository;
   }     

...

การพัฒนายังอยู่ในช่วงเริ่มต้น และหากฉันใช้วิธีนี้ ตัวสร้างนี้จะมีพารามิเตอร์ 5 ตัวขึ้นไปภายในไม่กี่วันข้างหน้า นี่ดูไม่ถูกต้อง

ฉันสามารถเก็บตรรกะทั้งหมดนี้ไว้ใน EFCustomerRepository ได้ แต่การทำเช่นนี้จะทำลายหลักการความรับผิดชอบเดียว ดังนั้นฉันจะไม่ทำอย่างนั้น

สุดท้ายนี้ ฉันสามารถรวมที่เก็บข้อมูลเหล่านี้และส่งอ็อบเจ็กต์ประเภท RepositoryWrapper เดียวไปยังคอนโทรลเลอร์ของฉันได้

ฉันไม่ต้องการแนะนำกรอบงานและเครื่องมือใด ๆ มากไปกว่าที่ฉันต้องทำ ฉันตั้งเป้าที่จะบรรลุการเชื่อมต่อแบบหลวมๆ และความสามารถในการขยายที่ง่ายดาย แต่ตอนนี้ฉันติดอยู่ระหว่างการส่งพารามิเตอร์เพิ่มเติมไปยังตัวสร้าง หรือการเขียน wrapper สำหรับที่เก็บ

ฉันใช้ MVC 3, EF 4.1, Ninject, Moq และ Automapper ขอบคุณ


comment
ความเป็นไปได้ที่ซ้ำกันของ ความบ้าคลั่งของตัวสร้างการพึ่งพาการฉีด   -  person Mark Seemann    schedule 16.08.2011


คำตอบ (2)


ฉันจะบอกว่าคุณต้องดูการรวมในโค้ดของคุณ (จากมุมมองของ Domain Driven Design) ดังนั้น หากคุณสามารถทำให้คลาสห่อหุ้มคลาสเล็กๆ อื่นๆ จำนวนมากโดยที่ไม่มีประโยชน์ในการจัดเก็บคลาสเหล่านั้นด้วยตัวเอง คุณสามารถสร้างออบเจ็กต์กราฟที่สวยงามและมี ICustomerRepository เดียวที่ห่อหุ้มการอ้างอิงภายในสำหรับประเภทลูกค้าตัวอย่าง

person thekip    schedule 16.08.2011
comment
ลงเอยด้วยการเขียนผลรวมเพื่อรวมที่เก็บข้อมูลของฉันไว้ในบริการเดียว - person ; 30.08.2011

อย่างไรก็ตาม การฉีดที่เก็บข้อมูลหลายรายการเข้าไปในตัวสร้างคอนโทรลเลอร์ไม่จำเป็นต้องเป็นแนวทางปฏิบัติที่ไม่ดีเสมอไป มันถูกเรียกว่า "constructor over-injection" ดูหนังสือของ Mark Seemann ในหัวข้อนี้

person Alessandro    schedule 18.06.2012