我上面的问题仍然有效,但以下内容可能对您有所帮助。
Funq 不支持自动构造函数注入(也称为自动连接),您必须通过构造Func<T>lambda 表达式手动完成此操作。因为您已经在手动进行构造函数注入,所以很容易选择IDbConnectionFactory要注入到服务中的内容。例子:
IDbConnectionFactory yellowDbConFactory =
new YellowDbConnectionFactory();
IDbConnectionFactory blueDbConFactory =
new BlueDbConnectionFactory();
IDbConnectionFactory purpleDbConFactory =
new PurpleDbConnectionFactory();
container.Register<IService1>(c =>
new Service1Impl(yellowDbConFactory,
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(blueDbConFactory);
container.Register<IService3>(c =>
new Service3Impl(purpleDbConFactory,
c.Resolve<IDep2>());
当然你也可以使用命名注册,像这样:
container.Register<IDbConnectionFactory>("yellow",
new YellowDbConnectionFactory());
container.Register<IDbConnectionFactory>("blue",
new BlueDbConnectionFactory());
container.Register<IDbConnectionFactory>("purple",
new PurpleDbConnectionFactory());
container.Register<IService1>(c =>
new Service1Impl(
c.Resolve<IDbConnectionFactory>("yellow"),
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(
c.Resolve<IDbConnectionFactory>("blue"));
container.Register<IService3>(c =>
new Service3Impl(
c.Resolve<IDbConnectionFactory>("purple"),
c.Resolve<IDep2>());
由于缺乏对自动装配的支持,您最终会得到这些相当尴尬的注册,这很快就会导致您的作曲根维护噩梦,但这与您的问题无关;-)
您通常应该尽量避免在您的注册中出现歧义。在您的情况下,您有一个接口,它做两件事(连接到两个数据库)。除非两个数据库共享完全相同的模型,否则每个数据库都应该有自己的接口(如果两个实现不可互换,您将违反Liskov 替换原则):
interface IYellowDbConnectionFactory : IDbConnectionFactory
{
}
interface IPurpleDbConnectionFactory : IDbConnectionFactory
{
}
由于 ServiceStack 的工作方式,您可能需要为每个实现一个实现:
class YellowDbConnectionFactory : OrmLiteConnectionFactory,
IYellowDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
class PurpleDbConnectionFactory : OrmLiteConnectionFactory,
IPurpleDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
现在您应该更改服务的定义以使用特定接口而不是使用IDbConnectionFactory:
public class MovieService : RestServiceBase<Movie>
{
private readonly IYellowDbConnectionFactory dbFactory;
public MovieService(IYellowDbConnectionFactory factory)
{
this.dbFactory = factory;
}
}
请注意,此类现在使用构造函数注入而不是属性注入。你可以让它与属性注入一起工作,但通常最好使用构造函数注入。这是一个关于它的问题。
使用 Funq,您的配置将如下所示:
container.Register<MovieService>(c =>
new MovieService(
c.Resolve<IYellowDbConnectionFactory>());
这两个新接口和两个类并MovieService没有给你带来很多好处,因为 Funq 不支持自动装配。您将成为手动将所有内容连接在一起的人。但是,当您切换到支持自动装配的框架时,这种设计允许容器毫无问题地注入正确的依赖项,因为没有关于注入什么的讨论。