2011-10-16 14 views
11

私はBaseControllerクラスから派生した任意のコントローラのプロパティを自動的に設定しようとしています。ここに私のApplication_Startメソッドのコードです。 UnitOfWorkプロパティは、アクセスしようとすると常にnullです。ここでベースコントローラクラスのプロパティ注入

var builder = new ContainerBuilder(); 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 
builder.RegisterType<VesteraTechnologiesContext>().As<IContext>(); 
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>(); 
builder.RegisterType<BaseController>() 
     .OnActivated(c => c.Instance.UnitOfWork = c.Context.Resolve<IUnitOfWork>()); 
var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

BaseControllerは、私は、コンストラクタを複製する必要がないように、私はコンストラクタで代わりにプロパティを経由して、これをやろうとしている理由がある

public class BaseController : Controller 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 
} 

次のようになりますUnitOfWorkプロパティへのアクセスが必要なすべてのコントローラで、コンストラクタは継承されないためです。

答えて

14

Autofacは、コントローラはコンストラクタ・インジェクションを使用して登録します。 property injection with autofacを有効にするには:

+0

nemesvありがとうございました。これは完全に機能しました。 –

+0

@nemesvチップのおかげで。これにパーフォーマンスがあれば分かりますか? – tugberk

+0

@tugberkプロダクション環境でPropertiesAutowiredを使用していないので、どれくらいのパフォーマンスに影響があるか分かりません。これは、リフレクションを使用してパブリックな設定可能プロパティを検索し、少なくとも通常のリフレクションコストを持つようにします。 – nemesv

-1

コンストラクタが継承されていないためです。

通常、それは次のようにベースのコンストラクタを呼び出すことが可能です:デフォルトで

public DescendantClass() 
    : base() 
{ 
} 
+0

OPには、IUnitOfWorkパラメータを持つコンストラクタが必要です。 –

+0

GertArnoldは正しいですが、私はコンストラクタをカスケードすることができますが、これは私が避けようとしていることです。ありがとう。 –

+0

非公開のコンストラクタを持つオブジェクトに対して「デフォルトのコンストラクタ」を提供しない限り、このようなパブリックコンストラクタには何もしません。ベースコンストラクタは、暗黙の「デフォルトコンストラクタ」によって自動的に呼び出されます。 – user2246674