2010-02-17 45 views
10

Cá nhân tôi thích tùy chọn cấu hình StructureMap từ mã C#. Từ những gì tôi hiểu, một trong những ưu điểm của DI, là chúng ta có thể dễ dàng trao đổi trong một ví dụ cụ thể mới. Tuy nhiên, nếu cấu hình được định nghĩa trong mã, thì các cá thể cụ thể được mã hóa cứng trong dll.Cấu hình Xml hoặc Cấu hình thông qua mã?

Vì vậy, thực tế, nó tốt như có mã hóa cứng các phụ thuộc, phải không? Tôi biết, trong quá trình thử nghiệm, nó giúp cuộc sống dễ dàng hơn ...

Điểm của tôi là, tốt hơn nên sử dụng cấu hình xml thay thế? bạn muốn bổ sung một ví dụ cụ thể mới? chỉ cần có trình cài đặt của bạn ghi đè lên tệp structuremap.config bằng tệp mới.

Vì vậy, cách ưa thích để cấu hình StructureMap là gì?

Bổ sung: Bắt buộc phải sử dụng cấu hình C# trong thời gian này vì tôi không biết cách chuyển chuỗi kết nối thành ví dụ. Tôi có thể viết chuỗi kết nối trong tập tin cấu hình, nhưng tôi muốn sử dụng lại chuỗi kết nối được định nghĩa trong app.config.

Trả lời

17

Bất kể bạn sử dụng DI Container cụ thể nào, bạn luôn nên trì hoãn độ phân giải của biểu đồ đối tượng của ứng dụng thành last responsible moment. Đây được gọi là số Composition Root của ứng dụng.

Bạn có thể viết số lượng lớn đơn đăng ký without ever referencing the DI Container. Điều này cũng có nghĩa là bạn có thể trì hoãn quyết định giữa cấu hình trong mã hoặc cấu hình cho đến khi bạn cần.

Bạn shouldn't need the container at all for unit testing, nhưng có thể cần nó để thử nghiệm tích hợp. Tuy nhiên, trong các thử nghiệm tích hợp, bạn có thể sẽ cần một cấu hình khác cho vùng chứa hơn là trong ứng dụng cuối cùng.

Tất cả trong tất cả, định cấu hình vùng chứa trong mã là cách tiếp cận ưa thích trong những ngày này vì nó mạnh mẽ hơn và bạn có thể áp dụng cơ chế cấu hình dựa trên quy ước.

Cấu hình XML có xu hướng dễ vỡ và quá dài. Trong hầu hết các trường hợp, nó chỉ đơn giản làm chậm bạn xuống vì bạn không nhận được sự hỗ trợ về trình biên dịch hoặc trình biên dịch.

Tuy nhiên, cấu hình XML vẫn hợp lệ khi bạn cần để có thể trao đổi các phụ thuộc mà không cần biên dịch lại ứng dụng. Hầu hết DI Containers sẽ cho phép bạn kết hợp các phương pháp tiếp cận này để bạn có thể có hầu hết cấu hình của mình trong mã, nhưng một vài phụ thuộc được lựa chọn được định nghĩa trong XML vì các lý do mở rộng.

+0

hmm ... Nghe có vẻ hợp lý. cảm ơn!! –

+0

Trong khi tôi đồng ý với câu trả lời của bạn. Có vẻ như câu hỏi thực sự được hỏi làm thế nào để tôi có được cấu hình ứng dụng của tôi vào các loại của tôi. – KevM

+0

@ KevM, không thực sự. Câu hỏi của tôi là nhiều hơn về tùy chọn cấu hình nào tốt hơn. Nó phát sinh, bởi vì tôi đã gặp khó khăn khi nhận chuỗi kết nối vào các loại của tôi bằng cách sử dụng xml. Tôi sẽ phải viết chuỗi kết nối thêm một lần nữa trong tệp structuremap.config. Tôi đã muốn tránh phải duy trì chuỗi kết nối ở hai nơi. –

6

Để trả lời câu hỏi của bạn, bạn có thể có bánh và ăn nó trong StructureMap. Bạn có thể cấu hình vùng chứa của bạn từ mã và đẩy thêm một chút cấu hình mà bạn cần từ cấu hình ứng dụng. Đó là những gì EqualToAppSetting dành cho.

Tạo một lớp thiết lập

public class DatabaseSettings 
{ 
    public DatabaseSettings(string type, string connectionString) 
    { 
     Type = type; 
     ConnectionString = connectionString; 
    } 

    public string Type { get; set; } 
    public string ConnectionString { get; set; } 
} 

Tiếp nói StructureMap để cấu hình nó sử dụng cài đặt ứng dụng của bạn.

 [Test] 
    public void setup_concrete_class_via_application_configuration() 
    { 
     var container = new Container(config => 
     { 
      config.ForConcreteType<DatabaseSettings>().Configure 
       .Ctor<string>("type").EqualToAppSetting("dovetail.database.type", "mssql") 
       .Ctor<string>("connectionString").EqualToAppSetting("dovetail.database.connectionString"); 

     }); 

     var databaseSettings = container.GetInstance<DatabaseSettings>(); 
     databaseSettings.Type.ShouldEqual("mssql"); 
     databaseSettings.ConnectionString.ShouldEqual("Data Source=.; Initial Catalog=dovetail;User Id=sa;Password=sa;"); 
    } 

Cuối cùng đây là những gì các thiết lập ứng dụng như thế nào trong cấu hình ứng dụng của tôi:

<appSettings> 
    <add key="dovetail.database.type" value="mssql"/> 
    <add key="dovetail.database.connectionString" value="Data Source=.;Initial Catalog=dovetail;User Id=sa;Password=sa;"/>  
</appSettings> 
+0

Tôi đã nghĩ về điều này, nhưng nhược điểm với tôi là tôi sẽ phải theo dõi chuỗi kết nối ở hai nơi. một ở đây và một lần trong phần chuỗi kết nối của web/app.config ... Cảm ơn bạn đã trả lời :) –

+0

đang sử dụng đề xuất của bạn vào lúc này để giải quyết vấn đề về chuỗi kết nối của tôi. Khi bắt đầu ứng dụng, tôi chỉnh sửa web.config để bao gồm một cài đặt ứng dụng mới được gọi là connectionString. Nó nhận giá trị của nó từ connectionString được định nghĩa trong phần connectionStrings thích hợp. Vì vậy, tôi phải sửa đổi chuỗi kết nối chỉ ở một nơi. và cấu hình structuremap của tôi có thể đọc nó từ các ứng dụng ... cảm ơn! –

+0

Rất vui được trợ giúp. Chúng tôi đã nướng một cách thông thường để kéo cấu hình vào các đối tượng cài đặt để tránh bất kỳ cấu hình vùng chứa nào. Tôi thực sự nên viết blog về điều đó. – KevM

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