Castle Windsor 注册带有构造函数参数的类

29

我有以下这个类:

public class DatabaseFactory<C> : Disposable, IDatabaseFactory<C> where C : DbContext, BaseContext, new()
{
    private C dataContext;
    private string connectionString;

    public DatabaseFactory(string connectionString)
    {
        this.connectionString = connectionString;
    }

    public C Get()
    {
        return dataContext ?? (dataContext = Activator.CreateInstance(typeof(C), new object[] {connectionString}) as C);
    }

    protected override void DisposeCore()
    {
        if (dataContext != null)
            dataContext.Dispose();
    }
}

当我尝试启动Web API时,出现以下错误:

无法创建组件'MyApp.DAL.Implementations.DatabaseFactory'1',因为它具有需要满足的依赖项。 'MyApp.DAL.Implementations.DatabaseFactory'1'正在等待以下依赖项: -未提供参数“connectionString”。您是否忘记设置该依赖项?

我应该如何正确注册它,并在运行时如何传递参数?

2个回答

47

您需要注册构造函数参数:

container.Register(
    Component.For<IDatabaseFactory>().ImplementedBy<DatabaseFactory>()
             .DependsOn(Dependency.OnValue("connectionString", connectionString))
    );

3
connectionString是一个变量。它如何传递给DependencyInstaller类? - Ivan-Mark Debono
@Ivan-MarkDebono,你不能从配置文件中读取它吗?你需要有多个连接字符串吗? - Ufuk Hacıoğulları
连接字符串从一个单独的数据库中检索,用户在登录时选择其中一个。EF模型始终相同,但用户可以从多个不同的数据库中进行选择。 - Ivan-Mark Debono
1
@Ivan-MarkDebono 那我建议将其传递给 Get 函数并从构造函数中删除它。它应该可以与当前功能一起工作。 - Ufuk Hacıoğulları

13
您可以在 Resolve() 方法上设置依赖项,方法是添加一个包含构造函数参数名称的匿名类型。

示例:

IDatabaseFactory factory = container.Resolve<IDatabaseFactory>
                           (new { connectionString = connectionString });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接