1

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

示例显示了这一点:

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

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

4

2 回答 2

2

该示例的意思是容器将为MyType每个请求创建一个实例。当它创建 的实例时MyType,依赖项IDependency将作为参数传递给 的构造函数MyTypeconnectionString.

您的示例代码需要一个输入参数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传递给对象构造函数,并且您可以根据需要自由使用它。

于 2014-02-16T18:22:17.393 回答
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>));

在此示例中,显示的方法是类的构造方法...可能需要可选参数。

有问题的文档:IoC 容器

于 2014-02-16T18:22:45.723 回答