0

Unityでインターセプトを使用したいのですが、ここに私のコードがあります:

UnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<T, T>();
container.Configure<Interception>().SetDefaultInterceptorFor<T>(new VirtualMethodInterceptor());
return container.Resolve<T>();

Tがパラメーターを持つコンストラクター(空のコンストラクター)を持つクラスである場合、Resolveを呼び出すと例外がスローされ、それ以外の場合は機能します。空でないコンストラクターを持つ型をインターセプトするにはどうすればよいですか?

アップデート

UnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<T, T>();
container.Configure<InjectedMembers>().ConfigureInjectionFor<T>(new InjectionConstructor());
container.Configure<Interception>().SetDefaultInterceptorFor<T>(new VirtualMethodInterceptor());
return container.Resolve<T>();

このコードは機能しますが、引数付きのコンストラクターを使用したい場合はどうなりますか?

私はこれを試しました:

public static T Resolve<T>(object param)
{
    UnityContainer container = new UnityContainer();
    container.AddNewExtension<Interception>();
    container.RegisterType<T, T>();
    container.Configure<InjectedMembers>().ConfigureInjectionFor<T>(new InjectionConstructor(param));
    container.Configure<Interception>().SetDefaultInterceptorFor<T>(new VirtualMethodInterceptor());
    return container.Resolve<T>();
}

そして私のコードでは:

var service = Resolve<MyService>(4);

そして、私は以前と同じ例外で戻ってきました...

4

3 に答える 3

1

Unityは引数が最も多いコンストラクターを選択するため、いくつかのオプションがあります。

1)構成を使用して、次のように引数なしコンストラクターを使用して指定します。

Container.Configure<InjectedMembers>()
    .ConfigureInjectionFor<MyService>(new InjectionConstructor());

2)オブジェクトに注釈を付ける

public class MyService
{
    [InjectionConstructor]
    public MyService()
    {
    }

    public MyService(int arg1)
    {     
    }
}

3)DefaultUnityConstructorSelectorPolicyを、引数なしのコンストラクターが存在する場合はそれを選択する独自のコンストラクターでオーバーライドします。

于 2009-06-18T04:50:13.397 に答える
1

バグです

于 2009-06-22T19:56:42.017 に答える
0

ここで説明するように、InjectionConstructor属性を使用します。

于 2009-06-11T17:11:29.657 に答える