この問題をどのように述べるかわからない、問題がどこにあるのかわからない。私はその遺伝的共分散問題だと思うが、その解決策は、おそらくインターフェースが設計されている方法や、実装の登録方法にあるかもしれない。Autofac登録し、一般的なインターアートを実装するタイプを解決する
とにかく、サンプルは汎用インターフェースを実装するすべてのタイプを登録しようとしており、後で汎用タイプのタイプを使用してタイプを解決しようとしています。次に、この型をその基本型にキャストしようとすると、その実装上でメソッドを呼び出すことができます。
キャストしようとすると失敗します。例として、コードの最初の行はコンパイルに失敗します。削除すると、実装をキャストしようとしている行でプログラムが失敗します。
class Program
{
private static IContainer _container;
static void Main(string[] args)
{
// Is this the problem?
IHandler<IConfiguration> test = new MyHandler();
// setup ioc
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(typeof(Program).Assembly)
//.Where(t => typeof(IHandler<IConfiguration>).IsAssignableFrom(t));
.Where(t => t.GetInterfaces()
.Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IHandler<>))
.Any()
)
.As(t => t.GetInterfaces()
.Where(i => i.GetGenericTypeDefinition() == typeof(IHandler<>))
.Single()
);
_container = builder.Build();
// get my configuration impl
var configuration = new MyConfiguration();
// resolve handler for the configuration
var configurationType = configuration.GetType();
var handlerGenericType = typeof(IHandler<>);
var handlerType = handlerGenericType.MakeGenericType(configurationType);
var handler = _container.Resolve(handlerType);
var typedHandler = (IHandler<IConfiguration>) handler;
// handle it!
typedHandler.Handle(configuration);
}
}
public interface IConfiguration
{
}
public interface IHandler<T> where T : IConfiguration
{
void Handle(T myConfiguration);
}
public class MyConfiguration : IConfiguration
{
}
public class MyHandler : IHandler<MyConfiguration>
{
public void Handle(MyConfiguration myConfiguration)
{
Console.WriteLine("Handling my stuff...");
}
}
それを試しても、それはまだ動作しません。 Tを試してみたところ、割り当ては動作しますが、ハンドラの実装はコンパイルされませんでした。 – MatteS
@マットS:そうです。更新された回答をご覧ください。 –
ありがとう、今は完全になぜこのdoesntの仕事を私に明確に。私は病気が私のデザインを考え直さなければならないと思う。そうでない場合は、リフレクションを使用してハンドラに呼び出すのが適切かもしれません。 – MatteS