【问题标题】:Lamar IoC Container Setup IssuesLamar IoC 容器设置问题
【发布时间】:2019-05-12 21:51:13
【问题描述】:

我一直试图让 Lamar 为我们的依赖注入工作,但我缺乏这样做的经验让我有些悲伤。

我有一个简单的虚拟控制器:

[Route("[controller]")]
public class TestController : Controller
{
    [HttpGet]
    public int GetRandom()
    {
        TestService service = new TestService();
        int value = service.GetRandomNumber();


        return value;
    }
}

TestService 内部是一个接口存储库,我希望 DI 应用到该存储库。

我已将 UseLamar 添加到我的 Program.cs,我的 startup.cs 如下所示:

    public void ConfigureContainer(ServiceRegistry services)
    {
        services.AddMvc();
        services.Scan(s =>
        {
            s.Assembly("Test.Components");
            s.WithDefaultConventions();
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Invalid");
        });

        app.UseMvc();
    }

通过阅读文档,我相信 Lamar 应该自动将我的接口映射到我的类型,因为它们具有相同的名称(IRepository -> Repository),尽管这不是我所看到的。

我很确定我错过了一些东西,但是我已经阅读了文档并且一直在尝试用谷歌搜索真实的例子但无济于事。 Startup.cs 中是否缺少某些行?我的服务是否需要构造函数来设置存储库?

【问题讨论】:

    标签: asp.net-core dependency-injection inversion-of-control lamar


    【解决方案1】:

    一般来说,您希望通过构造函数注入依赖项。在某些情况下,您可能会采用另一种方法,但根据我的经验,构造函数注入是 90% 以上的情况。

    因此,您确实希望将 IRepository 添加到您的 TestService 构造函数中。但是,从您的代码看来,您缺少有关依赖注入工作方式的更基本的东西。

    TestService service = new TestService();
    

    当您使用 new 创建对象时, 正在控制该对象的生命周期和范围。使用依赖注入框架的目的是让 it(框架/容器)为您管理依赖项及其范围/生命周期。如果您使用依赖注入容器实例化一个对象,它会为您解析该对象的依赖关系——它还管理 那些 依赖关系的依赖关系,依此类推,这样您就可以拥有一个无需手动(使用“new”)初始化大型对象图的复杂性即可解决的依赖链。

    要解决您的直接问题,您可以执行以下操作(这是糟糕的代码——不推荐!):

    TestService service = container.Resolve<ITestService>();
    

    容器将是您注册类型的 lamar 容器——我不熟悉 lamar,因此 Resolve() 语法可能看起来略有不同。这将解析 TestService 并注入一个 Repository 和 TestService 类的所有构造函数参数。

    执行此操作的首选方法是在应用程序的边界(入口点)解析依赖链,即控制器本身。因此,您的控制器应该接受 ITestService 作为构造函数参数,并且容器/框架将解析 TestController => TestService => Repository。

    您需要进行一些接线才能使其正常工作。正如我所说,我不了解 lamar,所以我不确定如何让它与 Asp.net Core 一起使用。

    在 Asp.Net Framework WebAPI 中,使用 Unity for DI 看起来像这样:

    GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new UnityControllerActivator(container));
    

    此代码将在您的应用程序启动时运行,并告诉 ASP.Net 框架:当请求进入时,使用提供的容器解析适当的控制器及其所有依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多