StructureMap ASP.net MVC非注入接口

本文关键字:注入 接口 MVC ASP net StructureMap | 更新日期: 2023-09-27 17:58:06

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

以下代码有效:

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 ASP.net MVC非注入接口

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

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

如果没有SingleImplementationsOfInterface()方法,structuremap就无法为IService接口识别正确的实现类。

你可以像下面的一样绘制地图

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

请尝试以下代码:

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

最后注册类和接口如下:

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

请参阅本文了解更多信息。