0

我一直试图让 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 中是否缺少某些行?我的服务是否需要构造函数来设置存储库?

4

1 回答 1

1

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

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

TestService service = new TestService();

当您使用new创建对象时,正在控制该对象的生命周期和范围。使用依赖注入框架的重点是让它(框架/容器)您管理依赖关系及其范围/生命周期。如果您使用依赖注入容器实例化一个对象,它会为您解析该对象的依赖关系——它还管理这些依赖关系的依赖关系,依此类推,这样您就可以拥有一连串的依赖关系,无需解决手动初始化大型对象图的复杂性(使用“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 框架:当请求进入时,使用提供的容器解析适当的控制器及其所有依赖项。

于 2018-12-11T22:57:28.120 回答