有没有一种方法可以使用IoC容器向助手类注入依赖关系?

时间:2019-07-09 21:31:48

标签: c# dependency-injection servicestack servicestack-ioc

我在一个服务中实例化了一个帮助器类。我想知道是否有一种方法可以使用IoC容器注入存储库并将其作为属性,而不是通过服务传递自动连接的存储库。

这是因为此帮助器类正在实现一个接口,而其他确实实现了该类的类可能不一定需要在该特定方法中采用该接口。

我正在尝试解决此问题而不更改大量代码。

public class SomeService : Service
{
    public IRepository Repo { get; set; }
    public object Get(Request req)
    {
        var helper = new SomeServiceHelper();
        var somethingFromHelper = helper.GetSomething();

        var SomethingFromRepo = Repo.GetSomethingElse();

        .
        .
        .
    }

    public object Post(Request req)
    {
        Repo.SaveSomething(something);
    }
}

public class SomeServiceHelper : IHelper
{
    public IRepository Repo { get; set; }
    public object GetSomething()
    {
        Repo.GetSomethingFromDB();

        .
        .
        .
    }
}

2 个答案:

答案 0 :(得分:3)

如果SomeService类本身仅需要存储库即可创建帮助器(示例中没有显示,顺便说一句,顺便说一句),最简单的解决方法是更改​​类以注入帮助器。

public class SomeService : Service
{
    private IHelper helper;

    public SomeService(IHelper helper)
    {
        this.helper = helper;
    }

    public object Get(Request req)
    {
        var somethingFromHelper = helper.GetSomething();
        // ... etc ...
    }
}

然后在助手实现中,对其进行更新以注入存储库:

public class SomeHelper : IHelper
{
    private IRepository repo;

    public SomeHelper(IRepository repo)
    {
        this.repo = repo;
    }

    public object GetSomething()
    {
        repo.GetSomethingFromDB();
        // ... etc ...
    }
}

此过程利用了您使用的任何DI容器,并将依赖项限制为专门用于类的内容。并且摆脱了多余的公共属性来启动,这也是一件好事。

答案 1 :(得分:1)

  

这是因为此帮助程序类正在实现接口和其他类   确实可以做到这一点的人不一定需要采用该特定方法。

您不需要针对接口注册您的帮助程序类,只需注册具体类型,例如:

container.RegisterAutoWired<SomeServiceHelper>();

或者:

container.Register(c => new SomeServiceHelper {
    Repo = c.Resolve<IRepository>(),
});

那么您可以在服务中注入一个或两个:

public class SomeService : Service
{
    public SomeServiceHelper Helper { get; set; }
    public IRepository Repo { get; set; }
}