Bản chất của câu hỏi của tôi là làm thế nào để soạn các đối tượng này (xem bên dưới) một cách hợp lý với MVC3 và Ninject (mặc dù tôi không chắc chắn DI nên đóng một vai trò trong giải pháp). Tôi không thể tiết lộ chi tiết thực sự của dự án của tôi nhưng đây là một phép tính xấp xỉ minh họa vấn đề/câu hỏi. Các câu trả lời trong VB hoặc C# được đánh giá cao!Soạn thảo các đối tượng đa hình trong dự án ASP.NET MVC3
Tôi có một số sản phẩm khác nhau với các thuộc tính thay đổi rộng rãi nhưng tất cả chúng đều cần được thể hiện trong danh mục. Mỗi lớp sản phẩm có một bảng tương ứng trong cơ sở dữ liệu của tôi. Một mục danh mục có một số thuộc tính cụ thể để trở thành mục nhập danh mục và do đó có bảng riêng. Tôi đã định nghĩa một giao diện cho các mục danh mục với mục đích gọi thuộc tính DescriptionText sẽ cung cấp cho tôi các kết quả rất khác nhau dựa trên loại bê tông cơ bản.
Public Class Clothing
Property Identity as Int64
Property AvailableSizes As List(Of String)
Property AvailableColor As List(Of String)
End Class
Public Class Fasteners
Property Identity as Int64
Property AvailableSizes As List(Of String)
Property AvailableFinishes As List(Of String)
Property IsMetric As Boolean
End Class
Public Interface ICatalogEntry
Property ProductId as Int64
Property PublishedOn As DateTime
Property DescriptionText As String
End Interface
Cho rằng DescriptionText là lớp trình bày quan tâm Tôi không muốn triển khai giao diện ICatalogEntry trong các lớp sản phẩm của mình. Thay vào đó, tôi muốn ủy thác cho một số loại định dạng.
Public Interface ICatalogEntryFormatter
Property DescriptionText As String
End Interface
Public Class ClothingCatalogEntryFormatter
Implements ICatalogEntryFormatter
Property DescriptionText As String
End Class
Public Class FastenerCatalogEntryFormatter
Implements ICatalogEntryFormatter
Property DescriptionText As String
End Class
Trong một bộ điều khiển ở đâu đó sẽ có mã như thế này:
Dim entries As List(Of ICatalogEntry)
= catalogService.CurrentCatalog(DateTime.Now)
Trong một cái nhìn ở đâu đó sẽ có mã như thế này:
<ul>
@For Each entry As ICatalogEntry In Model.Catalog
@<li>@entry.DescriptionText</li>
Next
</ul>
Vậy câu hỏi là những gì làm nhà thầu trông như thế nào? Làm thế nào để thiết lập nó để các đối tượng thích hợp được khởi tạo ở đúng nơi. Có vẻ như Generics hoặc DI có thể giúp đỡ với điều này nhưng tôi dường như có một khối tâm thần. Ý tưởng duy nhất mà tôi đưa ra là để thêm một tài sản ProductType để ICatalogEntry và sau đó thực hiện một nhà máy như thế này:
Public Class CatalogEntryFactory
Public Function Create(catEntry as ICatalogEntry) As ICatalogEntry
Select Case catEntry.ProductType
Case "Clothing"
Dim clothingProduct = clothingService.Get(catEntry.ProductId)
Dim clothingEntry = New ClothingCatalogEntry(clothingProduct)
Return result
Case "Fastener"
Dim fastenerProduct = fastenerService.Get(catEntry.ProductId)
Dim fastenerEntry = New FastenerCatalogEntry(fastenerProduct)
fastenerEntry.Formatter = New FastenerCatalogEntryFormatter
Return fastenerEntry
...
End Function
End Class
Public ClothingCatalogEntry
Public Sub New (product As ClothingProduct)
Me.Formatter = New ClothingCatalogEntryFormatter(product)
End Sub
Property DescriptionText As String
Get
Return Me.Formatter.DescriptionText
End Get
End Property
End Class
...FastenerCatalogEntry is omitted but you get the idea...
Public Class CatalogService
Public Function CurrentCatalog(currentDate as DateTime)
Dim theCatalog As List(Of ICatalogEntry)
= Me.repository.GetCatalog(currentDate)
Dim theResult As New List(Of ICatalogEntry)
For Each entry As ICataLogEntry In theCatalog
theResult.Add(factory.Create(entry))
Next
Return theResult
End Function
End Class
IMHO, tôi không thực sự nhận được bất kỳ mùi tắt mã này khác hơn là phải thay đổi nhà máy cho mỗi lớp sản phẩm mới đi kèm. Tuy nhiên, ruột của tôi nói rằng đây là cách làm cũ và ngày nay DI và/hoặc generics có thể làm điều này tốt hơn. Các đề xuất về cách xử lý này được đánh giá cao (như các đề xuất về tiêu đề tốt hơn ...)
Trình phân giải tùy chỉnh xử lý thực tế rằng nhiều hơn một lớp bản đồ đến cùng một giao diện? Đó là những gì đang đẩy tôi đến lớp nhà máy trong câu hỏi của tôi và đó là những gì tôi không thoải mái nhất và hoàn toàn không rõ ràng làm thế nào để thoát khỏi. – schmidlop
Ok, bây giờ tôi đã đọc liên kết bạn đã cung cấp, tôi đã kết luận rằng tôi nên mong đợi hợp lý vùng chứa DI của tôi (Ninject) để có một số câu trả lời cho trường hợp này. Hơn nữa nó có vẻ như nó không và tôi cần ràng buộc theo ngữ cảnh https://github.com/ninject/ninject/wiki/Contextual-Binding và tôi có thể cần điều này là tốt: https://github.com/ninject/ninject.extensions. nhà máy/wiki – schmidlop
Vâng, điều đó thực sự nên giải quyết vấn đề của bạn. Trong khởi tạo ninject của bạn, bạn sẽ có thể tải từ một tập tin tài nguyên. –