1
public class FooController : ApiController
{
   private IDb db;
    public FooController (IDb context)
    {
        db = context;
    }

    public void DoSomething(string value)
    {
        var output = new DoSomethingElse(value);
    }
}

DoSomethingElseobject 被这个类中的几个方法使用,但它不是所有方法的要求。如何注册和解决DoSomethingElse

4

1 回答 1

2

据我了解的问题:

public class FooController : ApiController
{
   private IDb db;
    public FooController (IDb context)
    {
        db = context;
    }

    public void DoSomething(string value)
    {
        var output = new DoSomethingElse(value);
    }
}

您不想在DoSomethingElse每次实例化FooController. 您还想在运行时为其提供一个值。

所以这需要工厂模式:

public interface IDoSomethingElseFactory
{
    IDoSomethingElse Create(string value);
}

public class DoSomethingElseFactory : IDoSomethingElseFactory
{
    public IDoSomethingElse Create(string value)
    {
        // Every call to this method will create a new instance
        return new DoSomethingElse(value);
    }
}

public class FooController : ApiController
{
    private IDb db;
    private readonly IDoSomethingElseFactory doSomethingElseFactory;

    public FooController (
        IDb context,
        IDoSomethingElseFactory doSomethingElseFactory)
    {
        db = context;
        this.doSomethingElseFactory = doSomethingElseFactory;
    }

    public void DoSomething(string value)
    {
        // this will be the point at which a brand new
        // instance of `DoSomethingElse` will be created.
        var output = doSomethingElseFactory.Create(value);
    }
}

然后注册这个:

builder.RegisterType<DoSomethingElseFactory>()
       .As<IDoSomethingElseFactory>()
于 2016-07-21T09:32:00.220 回答