2011-11-07 14 views
5

簡単な質問私は推測しますが、私のコントローラのための基本クラスを取得しようと1時間を費やして、いくつかのサービスをプロパティ注入によって注入しました。プロパティーは最初は保護されていましたが、オブジェクトを公開するように変更した後はオブジェクトがnullに戻りました。プロパティを保護してIoCを動作させるにはどうしてですか?Ninjectが基本クラスの保護されたプロパティを解決しないのはなぜですか?

これは私の設定です。 NinjectMVC3 App_Start

private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind(typeof(LoggingInterface.ILogger<>)).To(typeof(Log4NetLogger<>)); 
     kernel.Bind<IRepository>().To<Repository>(); 
     kernel.Bind<IUserService>().To<UserService>(); 
    } 

public class BaseController : Controller 
{ 
    [Inject] 
    protected LoggingInterface.ILogger<BaseController> Logger { set; get; } 

    [Inject] 
    protected IRepository Repository { set; get; } 

    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     .... 

     base.OnAuthorization(filterContext); 
    } 
} 

とブートストラッププログラムあなたは公共セッターを持っていないプロパティに注入することはできません、 スティーブン

答えて

6

、ありがとうございました。あなたのLoggerとRepositoryの両方のプロパティはであるので、が保護されているので、Ninjectが値を割り当てる方法はありません。これを達成するには、セッターの視認性を変更する必要があります。または、コンストラクタインジェクションを使用します。これは、必要と思われるリポジトリプロパティに対しては理にかなっていますが、ロガープロパティには意味がありません。だから私はそれを公開させなければならないと思う。 NinjectSettings

+1

ありがとうダーリン、それは私がちょうどそれで遊んで結論したものでした。プロパティの魅力的な理由は、子孫がctor注入でうんざりしてしまうことです。世話をする。 –

4

かなり確信してInjectNonPublicフラグあなたがやりたいように設定することができます - closest link I can find quickly

それは時間の任意のかなりの長さのためにサポートすることになるだろうかどうか、私は知らない - 注入陰部がされちょうど良いアイデア(プロパティインジェクションと関連する賛美歌:P)

関連する問題