1

Я новичок в контейнерах DI.Как обновить уже зарегистрированный сервис Castle Windsor

Я использую рамки третьей стороны и имеет класс, как показано ниже

public class PurchaseOrderAppService : IPurchaseOrderAppService, IAutoRegister 
    { 
     private readonly IEmail _email; 

     public PurchaseOrderAppService(IEmail email) 
     { 
      _email = email; 
     } 
    } 

Все классы, наследуемые интерфейс IAutoRegister автоматически регистрируются в рамках третьей стороны. Email класс, как показано ниже

public class Email : IEmail, IAutoRegister 
{ 
    public Send(string message) 
    { 
     //Send a message 
    } 
} 

То, что я хочу, что я хочу класс PurchaseOrderAppService использовать другой класс, называемый MyEmail вместо электронной почты.

public class MyEmail : IEmail 
{ 
    public Send(string message) 
    { 
     //Send a message another way 
    } 
} 

Как я могу обновить уже зарегистрированный сервис с помощью фреймворка?

Спасибо.

+0

Каково название структуры третьей части? Как это работает? –

+0

@YacoubMassad, имя третьей стороны здесь не важно. Я хочу знать, как я могу обновить сервис, уже зарегистрированный в контейнере DI. –

+0

У вас есть доступ к контейнеру? Можете ли вы показать существующие регистрации? –

ответ

1

Обновление зарегистрированного сервиса - это неправильный способ использования контейнера IoC и вам не нужно. Я хотел бы предложить вам взглянуть на https://github.com/castleproject/Windsor/blob/master/docs/inline-dependencies.md и https://github.com/castleproject/Windsor/blob/master/docs/registering-components-one-by-one.md#supplying-the-component-for-a-dependency-to-use-service-override

0

Благодаря @Thuan,

Во второй ссылке, есть метод, называемый ServiceOverrides который устаревания и я мог бы использовать DependsOn вместо,

IocContainer.Register(
    Component.For<IEmail>() 
    .ImplementedBy<MyEmail>() 
    .Named("Email.MyEmail"), 
    Component.For<IPurchaseOrderAppService>() 
    .ImplementedBy<PurchaseOrderAppService>() 
    .Named("PurchaseOrderAppServiceWithMyEmail").IsDefault() 
    .DependsOn(Dependency.OnComponent(typeof(IEmail), "Email.MyEmail")));