【问题标题】:StructureMap ASP.net MVC Not Injecting InterfaceStructureMap ASP.net MVC 不注入接口
【发布时间】:2014-04-12 16:52:22
【问题描述】:

我试图让结构映射依赖项正常工作,但在将接口放入构造函数而不是放入类名时,它无法正常工作。

以下代码有效:

public class HomeController : Controller
{
    private readonly MyService _service;

    public HomeController(MyService service)
    {
        _service = service;
    }

    public ActionResult Index()
    {
        return View();
    }
}

public class MyService : IService
{
    public string GetName()
    {
        return "Hello";
    }
}

public interface IService
{
    string GetName();
}

但是下面的代码不起作用:

public class HomeController : Controller
{
    private readonly IService _service;

    public HomeController(IService service)
    {
        _service = service;
    }

    public ActionResult Index()
    {
        return View();
    }
}

public class MyService : IService
{
    public string GetName()
    {
        return "Hello";
    }
}

public interface IService
{
    string GetName();
}

这里是来自 DependencyResolution 类的逻辑:

  public static IContainer Initialize() {
        ObjectFactory.Initialize(x =>
                    {
                        x.Scan(scan =>
                                {
                                    scan.TheCallingAssembly();
                                    scan.WithDefaultConventions();
                                });
        //                x.For<IExample>().Use<Example>();
                    });
        return ObjectFactory.Container;
    }

我正在使用 StructureMap.MVC4 nuget 包来设置依赖注入。我做错了什么?

【问题讨论】:

  • 发布设置 StructureMap 绑定的代码?
  • 我想我应该使用 x.For().Use();
  • 如果引用的程序集中只有一个,有没有办法让它假设 MyService?
  • @Jonathan - WithDefaultConventions() 实际上应该为您做到这一点,所以我不确定为什么不这样做。也许他们也必须在同一个命名空间中?
  • @mmillican 我可能是错的,但我相信 WithDefaultConventions 将 IFoo 映射到 Foo。在这种情况下,他想将IFoo 映射到MyFoo 鉴于这似乎是一个玩具示例,更改类型名称可能是一个不错的解决方案。

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


【解决方案1】:

在你的调用程序集中,如果你只有一个表示接口的实现类,你可以像下面这样使用

x.Scan(scan =>
             {
               scan.TheCallingAssembly();
               scan.WithDefaultConventions();
               scan.SingleImplementationsOfInterface();
             });

没有 SingleImplementationsOfInterface() 方法结构映射无法识别 IService 接口的正确实现类。

你可以像下面这样映射

ObjectFactory.Initialize(x =>
        {
            x.Scan(scan =>
            {
                scan.TheCallingAssembly();
                scan.WithDefaultConventions();
            });
            x.For<IService>().Use<MyService>();
        });

【讨论】:

    【解决方案2】:

    试试这段代码:

     public class MvcBootStrapper
            {
                public static void ConfigurationStructureMap()
                {
                    ObjectFactory.Initialize(x =>
                    {
                        x.AddRegistry<MyService>();
                    });
                }
            }
    

    最后像这样注册你的类和接口:

     public class SampleRegistery : Registry
            {
                public SampleRegistery ()
                {
                    ForRequestedType<IService>().TheDefaultIsConcreteType<MyService>();
                }
            }
    

    请参阅this 文章了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-06
      • 2011-02-14
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多