, @dave thieben. , , .
, Dave, .
var kernel = new StandardKernel();
kernel.Bind<FooBar>().ToSelf().InSingletonScope();
kernel.Bind<IFoo>().ToMethod(ctx => ctx.Kernel.Get<FooBar>());
kernel.Bind<IBar>().ToMethod(ctx => ctx.Kernel.Get<FooBar>());
, . .
"" .
var kernel = new StandardKernel();
kernel.Bind<FooBar>().ToSelf()
.Forward().As<IFoo>().As<IBar>()
.InSingletonScope();
public interface IBindingForwardSyntax<T> : IBindingWhenInNamedWithOrOnSyntax<T>
{
IBindingForwardSyntax<T> As<TService>();
}
public class BindingForwardBuilder<T>
: BindingBuilder<T>, IBindingForwardSyntax<T>
{
public BindingForwardBuilder(IBinding binding, IKernel kernel)
: base(binding, kernel) { }
public IBindingForwardSyntax<T> As<TForwardedType>()
{
Kernel.Bind<TForwardedType>().ToMethod(ctx =>
{
var provider = Binding.GetProvider(ctx);
if (!typeof(TForwardedType).IsAssignableFrom(provider.Type))
{
string message = string.Format(
"Invalid binding between '{0}' and '{1}'",
typeof(TForwardedType), typeof(T));
throw new InvalidOperationException(message);
}
return (TForwardedType)ctx.Kernel.Get(typeof(T));
});
return this;
}
}
, .
public static class BindingWhenInNamedWithOrOnSyntaxExtensions
{
public static IBindingForwardSyntax<T> Forward<T>(
this IBindingWhenInNamedWithOrOnSyntax<T> syntax)
{
return new BindingForwardBuilder<T>(syntax.Binding, syntax.Kernel);
}
}
, . . : . , , .