0

そこで、「ASP.NET MVC2InAction 」という本のデモをおならします。ただ遊んでいるだけの本当の理由ではありません。私は実際のIOCコンテナを使用して例を実装しようとしました(サンプルコードで使用されているものは偽物であり、もちろん機能します)。私が抱えている問題は、MakeGenericTypeが名前にバックティック1が付いた奇妙な型を返すことです。この質問を見ました。VisualStudioデバッガーでの型名のバックティックとはどういう意味ですか?それはそれが表示目的のためだけであることを示唆しているように思われますか?しかし、それはそのようには見えません。

これが私のコードです:

//here are the ways I tried to register the types
private static void InitContainer()
{
    if (_container == null)
    {
        _container = new UnityContainer();
    }
    _container.RegisterType<IMessageService, MessageService>();
    _container.RegisterType<IRepository, Repository>();
    _container.RegisterType(typeof(IRepository<Entity>), typeof(Repository<Entity>));
 }

これが私が実装しようとしているモデルバインダーからのコードです:

public class EntityModelBinder: IFilteredModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value == null)
            return null;
        if (string.IsNullOrEmpty(value.AttemptedValue))
            return null;
        int entityId;
        if (!int.TryParse(value.AttemptedValue, out entityId))
            return null;
        Type repoType = typeof (IRepository<>).MakeGenericType(bindingContext.ModelType);
        var repo = (IRepository)MvcApplication.Container.Resolve(repoType, repoType.FullName, new ResolverOverride[0]);
        Entity entity = repo.GetById(entityId);
        return entity;
    }

    public bool IsMatch(Type modelType)
    {
        return typeof (Entity).IsAssignableFrom(modelType);
    }
}

の呼び出しは、container.resolve常に次のエラーで爆発します。

依存関係の解決に失敗しました。type="MvcModelBinderDemo.IRepository`1[MvcModelBinderDemo.Entity]"、name = "MvcModelBinderDemo.IRepository`1 [[MvcModelBinderDemo.Entity、MvcModelBinderDemo、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null ]]"。例外が発生しました:解決中。

また、refをに入れるのMvcApplicationModelBinder少しずさんで、物事がどのように機能し、コンテナに到達する必要があるかを理解しようとしていることを私は知っています。

ご入力いただきありがとうございます。

4

1 に答える 1

1

問題は、で名前を明示的に指定していることだと思いますResolve。2 番目のパラメータを削除してみてくださいrepoType.FullName

を使ってみてくださいMvcApplication.Container.Resolve(repoType);using Microsoft.Practices.Unity;*.cs ファイルの先頭に追加することを忘れないでください。

バックティックの意味は、リンクした質問ですでに回答されています。しかし、あなたの結論は正しくありません。表示目的だけではありません。バックティック付きの名前は、クラスの CLR 名です。
それはあなたの問題の原因ではありません。

于 2012-09-06T04:59:12.113 に答える