Метод обслуживания вызовов DryIoc после разрешения - PullRequest
0 голосов
/ 23 июня 2019

Как сделать так, чтобы DryIoc разрешал Service как обычно, и сразу же после этого позволял ему вызывать метод Adjust( int ) с некоторыми конкретными параметрами?

ОБНОВЛЕНИЕ : На основании предложения, предоставленного дадхи , код изменен для использования RegisterInitializer

public interface IMaster
{
  void Run( int val );
}
public class Master : IMaster
{
  public Master( IService service )
  {
    service_ = service;
  }
  public void Run( int val )
  {
    service_.Execute( val );
  }

  private readonly IService service_;
}

public interface IService
{
  void Execute( int val );
}

public class Service : IService
{
  public void Adjust( int state ) // This method does not belong to the interface
  {
    Console.WriteLine( "Service state is adjusted with {0}", state );
    state_ = state;
  }

  public void Execute( int val )
  {
    var result = val + state_;
    Console.WriteLine( "Service execution resulted in {0}", result );
  }

  private int state_;
}

static void Main( string[] args )
{
  var container = new Container();

  container.Register<Service>( Reuse.Singleton );
  container.RegisterInitializer<IService>( ( service, resolver ) =>
                                           { // Casting type down is a bad idea.
                                             ( (Service)service ).Adjust( 5 );
                                           } );

  container.Register<IMaster, Master>( Reuse.Singleton,
                                       Parameters.Of.Type<IService>( typeof( Service ) ) );

  var master = container.Resolve<IMaster>();

  master.Run( 10 );
}

Приведенный выше код использует приведение типов, которое, во-первых, достаточно грязное, чтобы быть заблокированным нашими стандартами качества кода.

Во-вторых, может произойти другая регистрация для сопоставления IService с AlternativeService, которая не имеет ничего общего с методом Adjust.

Итак, вопрос в том, почему я не могу заменить container.RegisterInitializer<IService> на container.RegisterInitializer<Service>? Если я это сделаю, код инициализации не будет вызван.

И вообще, есть ли способ достичь того, что я хочу, без явного приведения типов? Было бы здорово, если бы мы могли связать инициализацию с конкретными классами, а не с интерфейсами.

1 Ответ

1 голос
/ 23 июня 2019

Вам может понадобиться RegisterInitializer метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...