【问题标题】:StructureMap Exception 202 No Default Instance defined (Version 2.61)StructureMap 异常 202 未定义默认实例(版本 2.61)
【发布时间】:2011-02-04 08:10:32
【问题描述】:

容器的初始化:

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());

Get 实例:

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 _babyRepository; {

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

类尝试 DI/Ioc

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

错误:

结构图异常代码:202 没有为 PluginFamily Domain.Repository.IBabyRepository 定义默认实例,Domain,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null

我做错了什么?

【问题讨论】:

  • WhatDoIHave 输出是否显示为 IBabyRepository 注册的 BabyRepository?
  • 另外,显示您尝试实例化的控制器的构造函数。
  • WhatDoIHave 是 StrcutMap objectfactory 容器的函数部分,它显示了哪些接口映射到了具体的接口
  • 添加了控制器和构造函数

标签: c# asp.net-mvc-2 structuremap


【解决方案1】:

您不会告诉 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)));
        }
    }
}

【讨论】:

  • 这看起来不错,但它仍然可以进行结构映射扫描以进行注入,而无需定义每个接口?
  • 例如,我会使用通用接口 ISomeStuff 并将其用于所有我希望被 DI 的接口吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多