EasyNetQ筆記-替換EasyNetQ元件
阿新 • • 發佈:2020-09-06
EasyNetQ是一個由小元件組成的庫。當你寫如下程式碼:
var bus = RabbitHutch.CreateBus("host=localhost");
靜態方法CreateBus通過IoC容器組裝這些元件,CreateBus的一個過載允許你訪問元件註冊,這樣您就可以提供您自己版本的EasyNetQ依賴項。過載方法原型如下:
public static IBus CreateBus(string connectionString, Action<IServiceRegister> registerServices)
IServiceRegister介面聲明瞭一個方法:
public interface IServiceRegister
{
IServiceRegister Register<TService>(Func<IServiceProvider, TService> serviceCreator) where TService : class;
}
因此,要註冊你自己實現IEasyNetQLogger介面的日誌例項,您需要編寫以下程式碼:
IEasyNetQLogger logger = new MyLogger(); // 注意要使用IEasyNetQLogger而不是var。 var bus = RabbitHutch.CreateBus(connectionString, serviceRegister => serviceRegister.Register(serviceProvider => logger));
Register方法的引數即Func<IServiceProvider, TService>委託,當CreateBus將元件組合在一起時,該委託方法將建立一個IBus例項。IServiceProvider宣告如下:
public interface IServiceProvider
{
TService Resolve<TService>() where TService : class;
}
這允許你訪問EasyNetQ提供的其他服務。
例如,如果您想用自己的ISerializer實現來替換預設的序列化器,並且您想用logger的引用來構造序列化器,那麼您可以這樣做:
var bus = RabbitHutch.CreateBus(connectionString,
serviceRegister => serviceRegister.Register<ISerializer>(
serviceProvider => new MySerializer(serviceProvider.Resolve<IEasyNetQLogger>())));
注意,此處我們必須在Register方法上顯式指定型別引數,以便內部IoC容器知道我們要替換的服務。
要檢視組成IBus例項的元件的完整列表,以及它們是如何組裝的,請看一下元件註冊 ComponentRegistration類。
您可以通過IAdvancedBus的Container屬性訪問容器。比如從容器中獲取你註冊的元件:
//拿出註冊的ISerializer服務例項
var serializer = bus.Advanced.Container.Resolve<ISerializer>();