2009-08-23 53 views
10

Tôi có tình huống sau đây:Thông tư liệu tham khảo trong tôi C# dự án

  1. Một dự án MyCompany.MyProject.Domain trong đó có mô hình tên miền của tôi, và các lớp học phần (chẳng hạn như Contact).

  2. Tôi muốn 'mở rộng' (theo từng phần, không phải là phương pháp khuyến nông) của tôi Contact lớp học với một thuộc tính Slug sẽ cung cấp cho tôi một biểu diễn văn bản thân thiện với URL đơn giản của họ và tên.

  3. Tôi có phương pháp mở rộng chuỗi ToSlug() trong dự án UtilityMyCompany.MyProject.Utilities của tôi thực hiện chính xác những gì tôi muốn trong 2).

  4. Vấn đề: Dự án Utility tôi đã được tham khảo dự án Domain tôi có nghĩa là tôi không thể nhận dự án Domain để xem phương pháp ToSlug() các Utility dự án mà không gây ra tham chiếu vòng tròn.

Tôi không muốn tạo một dự án khác để giải quyết vấn đề này và tôi thực sự muốn giữ logic Slug được chia sẻ.

Tôi làm cách nào để giải quyết vấn đề này?

+1

Tên 'Slug' có thích hợp ở đây không? Tâm trí mở rộng về lý do đằng sau việc sử dụng cái tên đó? Nó có nghĩa là gì? –

+0

Phần 'tham chiếu vòng-vấn đề-c' trong URL của câu hỏi này (http://stackoverflow.com/questions/1318123/circular-reference-problem-c) được gọi là sên. Về cơ bản, đó là thuật ngữ kỹ thuật cho phần chỉ định (thường là người có thể đọc được) trong một URL tham chiếu một thực thể/điểm cuối trong một ứng dụng web. Chủ yếu được sử dụng cho SEO hoặc làm cho URL trông đẹp hơn. – Alex

+0

Ok .... tốt trong trường hợp đó không nên 'Utility.ToSlug()' được làm việc trên một cái gì đó như 'ISluggable'? –

Trả lời

13

dự án Utility bạn tham khảo MyCompany.MyProject.Domain của bạn có vẻ như một chút của một mùi mã. Tôi giả định ở đây rằng đây là những tiện ích mà cụ thể làm việc trên các đối tượng miền - nếu đó là trường hợp, thì tại sao bạn không bao gồm MyCompany.MyProject.Utilities trong dự án Domain của bạn (tự nhiên, sửa đổi không gian tên cho phù hợp)?

Trong mọi trường hợp, cách bình thường để phá vỡ các loại phụ thuộc này là trừu tượng những gì được yêu cầu bởi một dự án thành một bộ giao diện và đóng gói chúng trong một hội đồng riêng biệt. Trước khi làm điều đó, hãy chắc chắn rằng những gì bạn đang làm khái niệm là điều đúng.

Trong trường hợp cụ thể của bạn tuy nhiên, xem xét giới thiệu một giao diện, tức là, INameHolder:.

public interface INameHolder 
{ 
    string FirstName { get; set; } 
    string LastName { get; set; } 
} 

Sau đó Contact thực hiện INameHolder. INameHolder tồn tại trong một hội đồng khác, hãy gọi nó là MyCompany.MyProject.Domain.Interfaces.

Sau đó, dự án Utilities của bạn tham chiếu Interfaces (khôngDomain) và do đó, Domain, nhưng Interfaces không tham chiếu tới bất cứ điều gì - các tham chiếu vòng tròn là bị hỏng.

+0

Tôi có thể sẽ đi với điều này .... thử nghiệm ngay bây giờ. – Alex

2

phương pháp ToSlug bản sao cho dự án miền và gọi ToSlug Đại biểu Utility của phương pháp mới này

+0

'Cuộc gọi ToSlug của Đại biểu Tiện ích đến phương thức mới này' - vui lòng làm rõ? Làm sao? – Alex

+0

đây cũng là suy nghĩ ban đầu của tôi - nhưng tôi cho rằng miền không được chia sẻ, do đó không cho phép thư viện mở rộng tải. Tôi có thể đã sai. –

2

Nếu bạn không thể chia sẻ tên miền (có thể đúng) và nó phải tiêu thụ logic từ một thư viện được chia sẻ thì bạn thực sự phải giới thiệu một hội đồng khác.

Hoặc bạn có thể tải logic khi chạy trong miền bằng cách phản ánh trong miền để truy cập vào thư viện phụ thuộc. Nó không khó chỉ phá vỡ kiểm tra thời gian biên dịch.

2

Nếu bạn chắc chắn về việc giữ mã trong tiện ích DLL (câu trả lời của Eric có vẻ thông minh với tôi), thì bạn có thể tạo giao diện trong dự án tiện ích của mình, chuyển giao diện đó làm tham số cho phương thức ToSlug của bạn đối tượng miền của bạn thực hiện giao diện.

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