我想用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;
}
}
答案 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();