Как сделать так, чтобы 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>
?
Если я это сделаю, код инициализации не будет вызван.
И вообще, есть ли способ достичь того, что я хочу, без явного приведения типов? Было бы здорово, если бы мы могли связать инициализацию с конкретными классами, а не с интерфейсами.