Câu hỏi của tôi ở trên vẫn còn hiệu lực, nhưng sau đây có thể giúp bạn anyway.
Funq không hỗ trợ tự động xây dựng phun (a.k.a. tự động dây), và bạn sẽ phải làm điều này bằng tay bằng cách xây dựng biểu thức lambda Func<T>
. Bởi vì bạn đã làm việc xây dựng tiêm bằng tay, rất dễ dàng để chọn những gì IDbConnectionFactory
bạn muốn tiêm vào dịch vụ của bạn. Ví dụ:
IDbConnectionFactory yellowDbConFactory =
new YellowDbConnectionFactory();
IDbConnectionFactory blueDbConFactory =
new BlueDbConnectionFactory();
IDbConnectionFactory purpleDbConFactory =
new PurpleDbConnectionFactory();
container.Register<IService1>(c =>
new Service1Impl(yellowDbConFactory,
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(blueDbConFactory);
container.Register<IService3>(c =>
new Service3Impl(purpleDbConFactory,
c.Resolve<IDep2>());
Tất nhiên bạn cũng có thể được sử dụng tên đăng ký, như thế này:
container.Register<IDbConnectionFactory>("yellow",
new YellowDbConnectionFactory());
container.Register<IDbConnectionFactory>("blue",
new BlueDbConnectionFactory());
container.Register<IDbConnectionFactory>("purple",
new PurpleDbConnectionFactory());
container.Register<IService1>(c =>
new Service1Impl(
c.Resolve<IDbConnectionFactory>("yellow"),
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(
c.Resolve<IDbConnectionFactory>("blue"));
container.Register<IService3>(c =>
new Service3Impl(
c.Resolve<IDbConnectionFactory>("purple"),
c.Resolve<IDep2>());
Do thiếu sự hỗ trợ cho tính năng tự động hệ thống dây điện, bạn sẽ kết thúc với những đăng ký khá vụng về, và điều này sẽ sớm dẫn đến một cơn ác mộng bảo trì của gốc thành phần của bạn, nhưng điều đó không liên quan đến câu hỏi của bạn ;-)
Bạn nên cố gắng ngăn ngừa sự mơ hồ trong đăng ký của mình. Trong trường hợp của bạn, bạn đã có một giao diện duy nhất, điều đó có hai thứ (kết nối với hai cơ sở dữ liệu).Trừ khi cả hai cơ sở dữ liệu chia sẻ mô hình chính xác như nhau, mỗi cơ sở dữ liệu xứng đáng giao diện riêng của mình (nếu hai ngôn ngữ này không hoán đổi cho nhau, bạn sẽ được vi phạm các Liskov substitution principle):
interface IYellowDbConnectionFactory : IDbConnectionFactory
{
}
interface IPurpleDbConnectionFactory : IDbConnectionFactory
{
}
Bởi vì các công trình cách ServiceStack, có thể bạn cần để thực hiện một triển khai thực hiện đối với từng:
class YellowDbConnectionFactory : OrmLiteConnectionFactory,
IYellowDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
class PurpleDbConnectionFactory : OrmLiteConnectionFactory,
IPurpleDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
Bây giờ bạn nên thay đổi định nghĩa về dịch vụ của bạn để sử dụng giao diện cụ thể thay vì sử dụng IDbConnectionFactory
:
public class MovieService : RestServiceBase<Movie>
{
private readonly IYellowDbConnectionFactory dbFactory;
public MovieService(IYellowDbConnectionFactory factory)
{
this.dbFactory = factory;
}
}
Lưu ý rằng lớp này hiện đang sử dụng phương thức khởi tạo thay vì tiêm thuộc tính. Bạn có thể làm điều này để làm việc với việc tiêm thuộc tính, nhưng thường tốt hơn là đi kèm với việc xây dựng tiêm. Đây là một SO question về nó.
Với Funq, cấu hình của bạn sau đó sẽ trông như thế này:
container.Register<MovieService>(c =>
new MovieService(
c.Resolve<IYellowDbConnectionFactory>());
Hai giao diện mới và hai lớp và thay đổi đến MovieService
không giành chiến thắng cho bạn rất nhiều, bởi vì Funq không hỗ trợ auto hệ thống dây điện. Bạn sẽ là người kết nối mọi thứ với nhau theo cách thủ công. Tuy nhiên, khi bạn chuyển sang khung làm việc thì hỗ trợ tự động đấu dây, thiết kế này cho phép vùng chứa tiêm phụ thuộc đúng mà không gặp sự cố, bởi vì không có thảo luận về nội dung cần tiêm.
Bạn có thể hiển thị một số mã không? Tôi nghĩ chúng tôi có thể cung cấp cho bạn một số mẹo về thiết kế ứng dụng của bạn, nhưng vì điều này, chúng tôi cần hiểu rõ hơn về thiết kế thực tế. Sẽ rất thú vị nếu bạn thấy những dịch vụ nào mà bạn đưa vào trong IDbConnectionFactory' và những dịch vụ đó làm gì với những phụ thuộc 'IDbConnectionFactory' đó. – Steven
Lưu ý tuy nhiên Funq là một container IoC rất đơn giản (một số thậm chí có thể tranh luận nó không phải là một container IoC ở tất cả), và tất cả mọi thứ phải được dây bằng tay. Tuy nhiên, bạn có thể tiêm mọi thứ bạn muốn trong mọi dịch vụ bạn tạo. – Steven
Tôi đã cập nhật câu hỏi, làm cho nó rõ ràng hơn một chút và tìm thấy bài viết của bạn trên Simple Injector. Tôi cho rằng đọc qua bây giờ với hy vọng làm sâu sắc thêm sự hiểu biết của tôi về IoC. –