如何在Funq.Container上使用ConnectionString?

时间:2014-02-16 17:09:52

标签: servicestack funq

使用Funq.Container初始化已注册的类型时,如何利用连接字符串属性? ServiceStack显示了在使用IoC容器(Funq.Container)注册类型时如何包含连接字符串,但我找不到实际使用该连接字符串的任何示例。我想在客户端使用它来为我的内部JsonClient指定基URI。

这些例子表明了这一点:

container.Register(new MyType(c.Resolve<IDependency>(), connectionString));

但是没有一个例子显示connectionString变量发生过任何事情。

2 个答案:

答案 0 :(得分:2)

该示例所说的是容器将为每个请求创建MyType的实例。当它创建MyType的实例时,依赖项IDependency将作为参数传递给MyType的构造函数,connectionString也是如此。

您的示例代码需要输入参数c,但是:

container.Register(c => new MyType(c.Resolve<IDependency>(), connectionString));

connectionString的使用取决于您。您可以在MyType的对象中使用它。您可能希望将其公开为公共属性,因此可以访问它。或者将它与你IDependency并用。通过一个扩展的例子:

public class MyType
{
    private IDependency _someDependency;
    public string ConnectionString { get; private set }

    public MyType(IDependency dependency, string connectionString)
    {
        _someDependency = dependency.SetConnectionString(connectionString); // Assumes this method exists.
        ConnectionString = connectionString;
    }
}

在自动装配MyType的服务中,您现在可以访问该对象。

public class MyService : Service
{
    public MyType MyType { get; set; }

    public void Get(SomeRequest request)
    {
         string connectionString = MyType.ConnectionString;
    }
}

如果您希望在其他地方解决MyType,可以使用

MyType myType = HostContext.Container.Resolve<MyType>();
string connectionString = myType.ConnectionString;

我希望这可以清除所有发生的事情,connectionString被传递到对象构造函数中,您可以根据需要自由使用它。

答案 1 :(得分:1)

再次检查文档。您引用的部分正上方的段落显示了一个委托方法,其中要实例化的对象需要一个连接字符串。我相信作者试图建议您可以通过构造函数向对象提供连接字符串(或任何其他所需的参数)......

container.Register(c => new MyType(c.Resolve<IDependency>(), connectionString));
container.Register<IMyType>(c => new MyType(c.Resolve<IDependency>(), connectionString));
container.Register(c => CreateAndInitialzeMyType(c.Resolve<IDependency1>(), c.Resolve<IDependency2>));

在这个例子中,显示的方法是类'构造函数方法......可能需要可选参数。

相关文档:The IoC container