如何让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>
?
如果执行此操作,则不会调用初始化代码。
更一般地说,没有显式类型强制转换,有什么方法可以实现我想要的?如果我们可以将初始化链接到具体的类而不是接口,那就太好了。