0

シンプルなシナリオ

public interface IFoo
{
   int GetData();
}

public class Foo : IFoo
{
    [CacheResult]
    public int GetData() { .... }
}

public class MyController
{
    [Dependency]
    IFoo Foo {get; set;}
}

インターフェイスを手動で登録すると、MyController の解決がうまくいきます。

container.RegisterType<IFoo, Foo>(new ContainerControlledLifetimeManager(),
    new InterceptionBehavior<PolicyInjectionBehavior>(),
    new Interceptor<InterfaceInterceptor>());

var controller = container.Resolve<MyController>();

自動登録を使用しようとすると:

        container.RegisterTypes(
            AllClasses.FromLoadedAssemblies(),
            WithMappings.FromMatchingInterface,
            WithName.Default,
            WithLifetime.ContainerControlled,
            getInjectionMembers: t => new InjectionMember[]
            {
                new Interceptor<InterfaceInterceptor>(),
                new InterceptionBehavior<PolicyInjectionBehavior>(),
            });

var controller = container.Resolve<MyController>();

渡された Type はインターフェイスでなければならないため、解決は ResolutionFailedException で失敗します。もちろん、インターフェイスにすれば機能しますが、Controller という名前の場合のみです。MyController や SqlController などを呼び出すと、インターフェイスを解決できないため、マッピングは失敗します。

Springフレームワークと同様に、アセンブリスキャンを実行したいと思っていましたが、理解できませんでした。

私は何が欠けていますか?それともUnityではできないのでしょうか?

4

1 に答える 1

2

問題は、 AllClasses.FromLoadedAssemblies がコントローラーと一致して登録されていることです。その後、Unity が (IFoo ではなく) コントローラーを解決しようとすると、コントローラーがインターフェイスに登録されていないことがわかります。

これは、一致するインターフェースを持つクラスのみに登録を減らすヘルパーです。

public static class TypeFilters
{
    public static IEnumerable<Type> WithMatchingInterface(this IEnumerable<Type> types)
    {
        return types.Where(type => 
            type.GetTypeInfo().GetInterface("I" + type.Name) != null);
    }
}

そして、これを使用して登録を次のように変更できます...

AllClasses.FromLoadedAssemblies().WithMatchingInterface()
于 2015-04-23T05:16:09.043 に答える