Autofac:寄存器类型,其中参数取决于ApiController的属性

时间:2017-10-12 10:25:11

标签: c# autofac

我想用Autofac注册Repository,以便它与无参数构造函数中的相同?然后我打算删除。 示例代码:

public class GroupController : ApiController
{
    protected IRepository Repository;
    protected ISettings Settings;

    protected GroupController()
    {
        Settings = new Settings();
        Repository = new Repository(User.Identity.IsAuthenticated ? Settings.ConfigAuth : Settings.Config)
    }

    public GroupController(ISettings settings, IRepository repository)
    {
        Repository = repository;
        Settings = settings;
    }
}

这是.Net框架中的api控制器。 设置以web.config编写。 这是autofac配置在我只有一个配置之前的样子。

var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
var settings = new Settings();
Builder.RegisterType<Repository>()
   .As<IRepository>()
   .WithParameter(new TypedParameter(typeof(RepoConfig), settings.Config))
   .InstancePerRequest();

目前只有一个IRepository实现。

public class Repository : IRepository
{
   private readonly RepoConfig _config;

   public(RepoConfig config)
   {
      _config = config;
   }
}

2 个答案:

答案 0 :(得分:0)

您可以使用Lambda注册。来自Autofac文档

  

您可以使用lambda表达式注册组件并创建一个   运行时选择权在注册中如何处理事物。   请注意,这可能会影响性能,具体取决于费用   运行时检查以及它执行的频率,但它是一个   选项。

http://docs.autofac.org/en/latest/register/registration.html(检查lambda表达式组件)

根据您使用Lambda注册的示例,您可以执行以下autofac reg(我尚未测试)

        var builder = new ContainerBuilder();

        builder.Register(c => new Settings()).As<ISettings>();

        builder.Register<Repository>((c) =>
            {
                ISettings s = c.Resolve<ISettings>();
                Settings repoSettings = User.Identity.IsAuthenticated ? s.ConfigAuth : s.Config;
                return new Repository(repoSettings);
            }
        )
       .As<IRepository>()
       .InstancePerRequest();

        Container = builder.Build();

然后删除无参数构造函数并添加

public GroupController(IRepository repository)
{
    Repository = repository;
}
希望它有所帮助。

答案 1 :(得分:0)

我为此实现实施了一种解决方法。不是最好的方式,但它的工作原理。 这样,Repository的初始化不需要参数,我在Controller的构造函数中用属性设置它。

public class GroupController : ApiController
{
    protected IRepository Repository;
    protected ISettings Settings;

    public GroupController(ISettings settings, IRepository repository)
    {
        Settings = settings;
        Repository = repository;
        Repository.RepoConfig = User.Identity.IsAuthenticated ? Settings.ConfigAuth : Settings.Config
    }
}

public class Repository : IRepository
{
   private readonly RepoConfig _config;

   public RepoConfig RepoConfig
   {
       get => _config;
       set
       {
           _config = value;
       }
   }
   ...
}

对于autofac,有标准的DI refister:

var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
Builder.RegisterType<Repository>()
   .As<IRepository>()
   .InstancePerRequest();