在web api和类库

时间:2017-01-06 10:21:09

标签: asp.net-mvc asp.net-web-api unity-container

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

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

在API项目中,我添加了Services项目的引用,在Services项目中,我添加了Repositories项目的引用,因此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文件,那么如何在Unity similart中注册ITestRepository和TestRepository到ITestService和TestService?有没有办法我可以在其他地方注册我的存储库项目的依赖项而不添加项目引用?或者,如果我试图在服务项目中添加统一,那么它将如何被注册?

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

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

2 个答案:

答案 0 :(得分:1)

这是一个很好的问题,我自己也没有团结一致。 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();
}

答案 1 :(得分:0)

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

serviceConfiguration.Local.cscfg

它在app_start中没有注册两次统一解决了我的问题。感谢上面的回答,基于上面的回答我实现了这个。