2008-11-14 21 views
15

Tôi không thể tìm ra cách xác định hàm tạo mặc định (khi nó tồn tại quá tải) cho một loại trong Sơ đồ cấu trúc (phiên bản 2.5) theo mã.Cách xác định hàm tạo mặc định bằng mã bằng StructureMap?

Tôi muốn nhận một phiên bản dịch vụ và vùng chứa phải tiêm một cá thể ngữ cảnh dữ liệu Linq2Sql vào trong đó.

tôi đã viết này trong phương pháp 'bootstrapper' của tôi:

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>(); 

Khi tôi chạy ứng dụng của tôi, tôi đã nhận lỗi này:

StructureMap Exception Code: 202
No Default Instance định nghĩa cho PluginFamily MyNamespace.Data.SqlRepository.MyDataContext, MyNamespace.Data, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null

Nếu tôi nhận xét tất cả các LINQ2Sql tạo ra contructors mà tôi không cần, nó hoạt động tốt.

Cập nhật: Ồ, và tôi quên nói rằng tôi sẽ không sử dụng thuộc tính [StructureMap.DefaultConstructor].

Trả lời

30

Bạn có thể chỉ định một hàm tạo với hàm ConstructedBy(). Vui lòng thử điều này:

ForRequestedType<MyDataContext>().TheDefault. 
Is.ConstructedBy(() => new MyDataContext()); 

Điều này phù hợp với tôi.

+0

Cảm ơn bạn rất nhiều, nó đã làm việc ở đây quá :-D! –

+23

Cập nhật SM 2.6 Cú pháp: Đối với (). Sử dụng (() => new MyDataContext()); – mxmissile

+1

Nó xuất hiện trong SM 2.6.2 rằng việc sử dụng không có bất kỳ đối số hàm tạo nào. –

0

Tôi không chắc chắn làm thế nào/nếu nó có thể được thực hiện với giao diện thông thạo/DSL nội bộ. Tuy nhiên, bạn có thể sử dụng thuộc tính, nếu bạn không lo lắng về việc gây ô nhiễm miền của mình?

Gắn thẻ hàm tạo ưa thích của bạn với [DefaultConstructor] StructureMap mặc định là hàm tạo tham lam theo quy ước (hàm tạo có nhiều tham số nhất).

+0

Xin lỗi Cik, tôi đã nhập (nhưng không được gửi) phản hồi của tôi trong khi cập nhật. –

+0

Không sao, lỗi của tôi ;-) Cảm ơn bạn đã trả lời! Cách tiếp cận chú thích DataContext của tôi (trong việc tạo ra một phần lớp) sẽ là có thể nhưng tôi nghĩ rằng nó thua từ lợi ích của việc sử dụng một IoC ... –

5

Tôi giả sử bạn cũng cần đặt thời lượng đối tượng (InstanceScope) nếu bạn đang sử dụng Linq2Sql. Tôi khuyên bạn nên sử dụng mã này vì nó cung cấp cho bạn một chút linh hoạt hơn.

ForRequestedType<MyDataContext>() 
      .CacheBy(InstanceScope.PerRequest) 
      .TheDefault.Is.OfConcreteType<MyDataContext>() 

SelectConstructor<MyDataContext>(() => new MyDataContext()); 

Với mã này, bạn cũng có thể tiêm thêm định nghĩa các giao diện vào constructor MyDataContext như thế này

SelectConstructor<MyDataContext>(() => new MyDataContext((IDatabaseFactory)null)); 

Chỉ cần nhớ để xác định kiểu dữ liệu cụ với StructureMap ví dụ IDatabaseFactory của bạn.

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