2011-02-04 33 views
0

初始化容器的:StructureMap異常202沒有定義默認實例(版本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異常代碼:202 沒有默認實例PluginFamily Domain.Repository.IBabyRepository定義,域,版本= 1.0.0.0,文化=中立,PublicKeyToken = null

我在做什麼錯?

+0

是否註冊IBabyRepository的WhatDoIHave輸出顯示BabyRepository? – 2011-02-04 20:38:05

+0

另外,顯示您正嘗試實例化的控制器的構造函數。 – 2011-02-04 20:38:46

回答

0

你不告訴StructureMap如何創建BabyRepository。

我覺得您的掃描需要是這樣的:

 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))); 
     } 
    } 
} 
相關問題