servicestack,Dependency Injection,Inversion Of Control,servicestack" /> servicestack,Dependency Injection,Inversion Of Control,servicestack" />

Dependency injection ServiceStack IoC DI设计在单独的项目中解决问题

Dependency injection ServiceStack IoC DI设计在单独的项目中解决问题,dependency-injection,inversion-of-control,servicestack,Dependency Injection,Inversion Of Control,servicestack,我有一个使用SS(很棒的框架!!)的项目。 这是一个RESTAPI。我在提供接口的同一解决方案中引用了另一个项目(我在VS2012中这样做)。我还有一个第三个项目,在同一个解决方案中实现了这个接口。让我们把这些项目称为: WebAPI接口引擎 WebAPI引用了接口和引擎。引擎引用接口 到目前为止一切顺利 我在appHost(WebAPI的)中使用IOC来注册引擎的接口,这也很有效 我的问题是我的引擎需要访问Ormlite数据库。我已将ServiceStatck.OrmLight.Mysql的引

我有一个使用SS(很棒的框架!!)的项目。 这是一个RESTAPI。我在提供接口的同一解决方案中引用了另一个项目(我在VS2012中这样做)。我还有一个第三个项目,在同一个解决方案中实现了这个接口。让我们把这些项目称为:

WebAPI
接口
引擎

WebAPI引用了接口和引擎。引擎引用接口

到目前为止一切顺利

我在appHost(WebAPI的)中使用IOC来注册引擎的接口,这也很有效

我的问题是我的引擎需要访问Ormlite数据库。我已将ServiceStatck.OrmLight.Mysql的引用添加到引擎中,但在引擎构造函数中引用时,该引用为null

public Engine()
    {
        using (var db = DbConnectionFactory.OpenDbConnection())
        {
            //do db operations
        }
    }
我可以从Webapi访问并找到数据库。如何将数据库通知引擎?我似乎迷失在层层之中

我希望这是清楚的(考虑到)。

如果您的AppHost(在WebAPI项目中)正在注册并解析Engine/IEEngine实例,那么您需要将IDbConnectionFactory注入到您的引擎实例中

最好的方法是通过构造函数注入

修改引擎类以获取对IDbConnectionFactory的依赖:

public class Engine : IEngine
{
    IDbConnectionFactory dbFactory = null;

    public Engine(IDbConnectionFactory dbFactory)  // IoC container injects dbFactory
    {
        this.dbFactory = dbFactory;
    }

    public void DoSomething()
    {
        using (var db = dbFactory.OpenDbConnection())
        {
            //do db operations
        }
    }
}
如果您的依赖项已注册,引擎将从主AppHost获得dbFactory

至于项目/解决方案设置,我建议查看推荐的ServiceStack
()。

你有机会看看吗?除非我遗漏了什么——这不是我的问题。我的问题是,在我的引擎项目中,我没有访问容器的权限,因此无法访问在webAPI的appHost中注册的DbConnectionFactor。我对SS不太了解,但从您的问题来看,您似乎试图在webAPI项目和引擎项目之间创建循环依赖关系使用国际奥委会。我认为您最好将ormLite依赖项转移到引擎,并将其配置保存在WebApi配置中。