7

私は自分のコードでこれをかなりやっているようです:

public class ActionsModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            base.Load(builder);
            builder.Register(c => LogManager.GetCurrentClassLogger()).As<ILog>().InstancePerDependency();

            // Autofac doesn't seem to be able to inject things without explicit binding 
            builder.RegisterType<ComboActions>().As<ComboActions>().InstancePerHttpRequest();
            builder.RegisterType<AppActions>().As<AppActions>().InstancePerHttpRequest();
        }
    }
}

「アクション」クラスは、コントローラーに注入する必要があるクラスであり、他のさまざまなサブ依存関係があります。

少しゴミのようです。クラスに既に満たされた依存関係を持つコンストラクターがあり、インスタンスを自動的に作成していることを autofac が解決できないのはなぜですか?

つまり、クラス A がクラス B を注入する必要があり、クラス B が C、D、E などを必要とする場合、実行時にクラスを作成できるかどうかを確認するために、依存チェーン全体を調べたくないと思います。...しかし、クラス A が明示的にバインドされている C と D に直接依存している場合、それは確かに些細なケースですか?

何か不足していますか?これに関するドキュメントが表示されないようです...

4

2 に答える 2

26

すべてのタイプを登録する必要はありません。Autofac は AnyConcreteTypeNotAlreadyRegisteredSource を提供しますこれは、登録をまだ提供していない場合に、具象型を自動的に取得します。

例えば:

var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
var container = builder.Build();
...
var myConcreteType = container.Resolve<MyConcreteType>();

ソースは、インターフェースや抽象クラスベースの依存関係のためにモック化されたオブジェクトを自動的に注入するなど、より複雑なことを可能にします。

于 2012-07-13T03:52:46.417 に答える
2

AFAIK、Autofacでは、必要なすべてのタイプをコンテナーに登録する必要がありますが、これは、それぞれを個別に行う必要があるという意味ではありません。私の登録のほぼ99%は、次の属性をタイプに追加することによって処理されます。

[AttributeUsage(AttributeTargets.Class)]
public class AutoRegisterAttribute : Attribute { }

たとえば、

[AutoRegister]
class ComboActions
{

そして、私はそれらをこれに登録します:

public class AutoScanModule : Module
{
    private readonly Assembly[] _assembliesToScan;

    public AutoScanModule(params Assembly[] assembliesToScan)
    {
        _assembliesToScan = assembliesToScan;
    }

    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterAssemblyTypes(_assembliesToScan)
            .Where(t => t.GetCustomAttributes(typeof (AutoRegisterAttribute), false).Any())
            .AsSelf()
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();
    }
}

私が言ったように、これは私の登録のほとんどをカバーします、そしてそれから私は通常サードパーティタイプ、オープンジェネリックとデコレータのようなものについて心配する必要があるだけです。

編集:私が間違っていることを証明するKalebからの返信をチェックしてください。知らなかったクールな機能!

于 2012-07-12T12:24:03.197 に答える