2011-02-04 35 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))); 
     } 
    } 
} 
相关问题