决议后的DryIoc呼叫服务方法

时间:2019-06-23 10:52:45

标签: dryioc

如何让DryIoc像往常一样解析Service,然后立即让它使用一些特定参数调用其Adjust( int )方法?

更新:根据 dadhi 提供的建议,将代码更改为使用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 个答案:

答案 0 :(得分:1)

您可能需要使用RegisterInitializer方法。