在网络 api 和 class 库中使用 unity DI

Using unity DI in both web api and class library

我正在创建一个新的网络 api 项目。在这里,除了网络 api 项目之外,我还使用了两个 class 库项目,如下所示:

MyBlog.API (Web API project)
MyBlog.Services (Class library)- Contains additional business logic
MyBlog.Repositories (Class library) - contains all database related operations

在 API 项目中,我添加了服务项目的引用,在服务项目中,我添加了存储库项目的引用,因此 API 将调用服务,而服务将调用存储库,如下所示:

API > Services > Repositories

我不想直接从我的 api 控制器调用存储库,它们将通过服务调用。所以我没有在 api 项目中添加存储库项目引用。

现在我正在我的 api 项目中实施 unity.webapi 依赖注入。以下是实现 DI 的代码:

存储库代码:

namespace MyBlogs.Repositories
{
    public interface ITestRepository
    {
        string Get();
    }
}

namespace MyBlogs.Repositories
{
    public class TestRepository:ITestRepository
    {
        public string Get()
        {
            return "test";
        }
    }
}

具有 DI 实现的服务代码:

namespace MyBlogs.Services
{
    public interface ITestService
    {
        string Get();
    }
}

namespace MyBlogs.Services
{
    public class TestService : ITestService
    {
        private ITestRepository testRepository;

        public TestService(ITestRepository testRepositoryParam)
        {
            this.testRepository = testRepositoryParam;
        }

        public string Get()
        {
            return this.testRepository.Get();
        }
    }
}

控制器代码:

public class ValuesController : ApiController
    {
        private ITestService testService;
        public ValuesController(ITestService testServiceParam)
        {
            this.testService = testServiceParam;
        }

        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { this.testService.Get() };
        }
}

最后是 unityconfig 文件:

public static class UnityConfig
    {
        public static void RegisterComponents()
        {
            var container = new UnityContainer();
            container.RegisterType<ITestService, TestService>();

            GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
        }
    }

现在我遇到了这个问题,因为我没有在 api 项目中添加存储库项目引用,我有这个 unityconfig 文件所以我如何注册 ITestRepository 和 TestRepository 类似于 ITestService 和 TestService? ?有什么方法可以在不添加项目引用的情况下在其他地方注册我的存储库项目的依赖项?或者,如果我将尝试在服务项目中添加统一性,那么它将如何注册?

我已经在 web api 项目的 global.asax 中注册了 unityConfig:

protected void Application_Start()
        {
            UnityConfig.RegisterComponents();
        }

这是一个很好的问题,我自己还没有团结一致地做到这一点。 Autofac、Windsor 和其他 DI 允许您公开每个程序集中的模块或安装程序,然后从其他引用它们的程序集中加载模块。

所以我将根据这个想法提出一个通用的解决方案。 (希望这能奏效:))

public static class WebApiUnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();
        container.RegisterType<ITestService, TestService>();

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}   


public static class ServicesUnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();
        container.RegisterType<ITestRepository, TestRepository>();

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}   


protected void Application_Start()
{
     ServiceUnityConfig.RegisterComponents();
     WebApiUnityConfig.RegisterComponents();
}

我通过在服务项目中创建一个统一文件来解决它,并通过将相同的 UnityContainer 作为参数传递给服务的统一文件,直接从 api 项目的统一文件调用其 RegisterComponents 方法,如下所示:

public static class UnityConfig
{
    public static void RegisterComponents()
    {
    var container = new UnityContainer();

        container.RegisterType<ITestService, TestService>();
        ServiceUnityConfig.RegisterComponents(container);

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}

public static class ServiceUnityConfig
{
    public static void RegisterComponents(UnityContainer container)
    {
        container.RegisterType<ITestRepository, TestRepository>();
    }
}

在app_start中没有注册两次unity就解决了我的问题。感谢eran的上述回答,基于上述回答我是这样实现的。