2011-02-04 13 views
0

初期化:のStructureMap例外202 Noデフォルトのインスタンスが定義された(バージョン2.61)コンテナの

public override void Initialize() 
     { 

      ObjectFactory.Initialize(x => 
             { 
              x.Scan(s => 
                 { 
                  s.TheCallingAssembly(); 
                  s.AssemblyContainingType<IRegistar>(); 
                  s.WithDefaultConventions(); 

                 }); 

             }); 

     } 

Global.asax.xc

var dependencyContainer = new DependencyContainer(); 
      dependencyContainer.Initialize(); 

      ControllerBuilder.Current.SetControllerFactory(new DependencyControllerFactory()); 

ゲットインスタンス:

public class DependencyControllerFactory : DefaultControllerFactory 
{ 
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
     { 
      if (controllerType == null) 
      { 
       return base.GetControllerInstance(requestContext, controllerType); 
      } 

      try 
      { 
       return ObjectFactory.GetInstance(controllerType) as Controller; 
      } 
      catch (StructureMapException exception) 
      { 
       Debug.WriteLine(ObjectFactory.WhatDoIHave()); 
       throw; 
      } 
     } 
    } 

コントローラ

プライベートIBabyRepository _babyReposoitory; {

public BabyController(IBabyRepository babyRepository) 
    { 
     _babyReposoitory = babyRepository; 
    } 

クラスDI/Iocをしようとして

public class BabyRepository : IBabyRepository, IRepository<Baby>, IRegistar 
{ 
    Just a Default constructor here(); 
    code... 
} 

エラー:

のStructureMap例外コード:PluginFamily Domain.Repository.IBabyRepositoryために定義された202 いいえデフォルトインスタンスません、ドメイン、バージョン= 1.0.0.0、文化=ニュートラル、PublicKeyToken = null

Me

私は間違っていますか?

+0

はIBabyRepositoryに登録さWhatDoIHave出力ショーBabyRepositoryしていますか? –

+0

また、インスタンス化しようとしているコントローラのコンストラクタを表示します。 –

+0

WhatDoIHaveはStrcutMapオブジェクトコンテナの一部です。どのインタフェースがどのコンクリートにマップされているかを示します。 – Neurath

答えて

0

あなたはBabyRepositoryの作成方法をStructureMapに指示しません。

私はあなたのスキャンがこのようなものにする必要があると思う:

 Scan(y => 
     { 
      y.AssemblyContainingType<IRegistar>(); 
      y.Assembly(Assembly.GetExecutingAssembly().FullName); 
      y.With(new RepositoryScanner()); 
     }) 

は、次にカスタムRepositoryScannerをコーディングする必要があります。

public class RepositoryScanner : IRegistrationConvention 
{ 
    public void Process(Type type, Registry registry) 
    { 
     if (type.BaseType == null) return; 

     if (type.GetInterface(typeof(IRepository).Name) != null) 
     { 
      var name = type.Name; 

      registry 
       .For<IRepository>() 
       .AddInstances(y => y.Instance(new ConfiguredInstance(type).Named(name))); 
     } 
    } 
} 
+1

これはいいようですが、各インターフェイスを定義することなく、注入のための構造マップのスキャンを作成するにはどうしてですか? – Neurath

+0

たとえば、汎用インターフェースISomeStuffを使用して、それをすべてのポイントですべてのインターフェースに使用したいと思いますか? – Neurath