您将如何在Funq中注册不同的IDbConnectionFactory实例,然后直接在您的服务中访问它们?命名实例会以某种方式在这里发挥作用吗?
这是跨服务使用不同数据库时最好的方法吗?
谢谢!
编辑:
一个例子 ;).我可能会离开这里,因为我对IoC很新,但是比如说我有2个独立的数据库连接,我想注入.在ServiceStack中,这是在Global.asax中完成的.
container.Register<IDbConnectionFactory>(c =>
new OrmLiteConnectionFactory(@"Connection String 1", SqlServerOrmLiteDialectProvider.Instance));
container.Register<IDbConnectionFactory>(c =>
new OrmLiteConnectionFactory(@"Connection String 2", SqlServerOrmLiteDialectProvider.Instance));
Run Code Online (Sandbox Code Playgroud)
这两个似乎都注入了谦逊的海鲂.
然后通过以下方式在服务端自动访问它们:
public IDbConnectionFactory DbFactory { get; set; }
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它似乎给了我第一个注册.如何访问服务端的特定访问权限?希望这会让它更加清晰.
这是ServiceStack.Examples的完整示例,仅使用1个IDbConnectionFactory: Movies Rest
在工作中,我们在ServiceStack中进行了几个新的Web服务项目,并在其中一些项目中利用了Funq.我目前正在开发一个单独的项目,它将使用所述Web服务,并且想知道我是否有办法在我的项目中使用ServiceStack的Funq来解析我的依赖关系,以便使用我们正在使用的或多或少相同的模式开发我们的Web服务.
这可能吗?
Funq IoC容器是否支持解析类型的所有注册?像这两个中的任何一个:
IEnumerable<IFoo> foos = container.Resolve<IEnumerable<IFoo>>();
IEnumerable<IFoo> foos = container.ResolveAll<IFoo>();
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个在我的Compact Framework应用程序中使用的IoC容器.尝试Funq我注意到我找不到用它来进行Property Injection的方法.
我查看了项目网站的讨论和单元测试,但我找不到任何Property Injection的例子.
Funq是否支持Property Injection?
.net dependency-injection compact-framework inversion-of-control funq
Container从控制器中访问实例?Container.Resolve在我的课堂上使用但是如何访问Container实例?new Container()或有链接Funq.StaticContainer吗?感谢Mythz 的主旨提示,a)或b)或c).
我将使用Mythz的解决方案,它被我接受,但有关于它的模式(ServiceLocator模式)的问题,你可以在这里查看额外的信息.
我有一个服务,它在其构造函数中采用IMyDependency.IMyDependency,MyDependency和服务都存在于同一个程序集中.MyDependency有一个单一的,公共的无参数构造函数.
令我惊讶的是,这不起作用:
container.RegisterAutoWired<IMyDependency>();
Run Code Online (Sandbox Code Playgroud)
它抛出一个"System.NullReferenceException".
如果我这样做,它的工作原理:
container.RegisterAutoWiredAs<MyDependency, IMyDependency>();
Run Code Online (Sandbox Code Playgroud)
但那么,这样做:
container.RegisterAs<MyDependency, IMyDependency>();
Run Code Online (Sandbox Code Playgroud)
那么区别是什么呢?如果"自动布线"找不到具体的实现,并且对于是否可以解决需要依赖性的服务没有区别,那么什么是自动布线?
Funq应该能按惯例找到具体的实现吗?如果是这样的话,那个约定是什么,如果不是同名的话?
谢谢.
dependency-injection inversion-of-control convention-over-configur servicestack funq
我读过Phillip Haydon关于如何在ServiceStack中使用NHibernate/RavenDB的这篇文章.
我没有看到关于获取IDocumentStore并在每次我需要db中的内容时打开新会话这一点:
public class FooService : ServiceBase<Foo>
{
public IDocumentStore RavenStore{ get; set; }
protected override object Run(ProductFind request)
{
using (var session = RavenStore.OpenSession())
{
// Do Something...
return new FooResponse{/*Object init*/};
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能每个请求只使用一个会话,当请求结束时,根据响应状态提交更改或回滚?
如果我的方法很好,我怎么能实现呢?这是我的尝试:
我创建了这个类:
public class RavenSession : IRavenSession
{
#region Data Members
private readonly IDocumentStore _store;
private IDocumentSession _innerSession;
#endregion
#region Properties
public IDocumentSession InnerSession
{
get { return _innerSession ?? (_innerSession = _store.OpenSession()); }
}
#endregion
#region Ctor
public RavenSession(IDocumentStore …Run Code Online (Sandbox Code Playgroud) 我有两个课程,我需要互相参考.
class Foo
{
public Foo(IBar bar) {}
}
class Bar
{
public Bar(IFoo foo) {}
}
Run Code Online (Sandbox Code Playgroud)
当我做:
container.RegisterAutoWiredAs<Foo, IFoo>();
container.RegisterAutoWiredAs<Bar, IBar>();
Run Code Online (Sandbox Code Playgroud)
当我尝试解决任一接口时,我得到一个循环依赖图,导致无限循环.有没有一种简单的方法可以在Funq中解决这个问题,或者您知道一种解决方法吗?
我有以下存储库类:
public class Repository<T> : IDisposable where T : new()
{
public IDbConnectionFactory DbFactory { get; set; } //Injected by IOC
IDbConnection db;
IDbConnection Db
{
get
{
return db ?? (db = DbFactory.Open());
}
}
public Repository()
{
Db.DropAndCreateTable<T>();
}
public List<T> GetByIds(long[] ids)
{
return Db.Ids<T>(ids).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的AppHost.Configure().我像这样注册依赖:
container.Register<IDbConnectionFactory>(c =>
new OrmLiteConnectionFactory(ConfigurationManager.
ConnectionStrings["AppDb"].ConnectionString, SqlServerDialect.Provider));
container.RegisterAutoWired<Repository<Todo>>().ReusedWithin(Funq.ReuseScope.None);
Run Code Online (Sandbox Code Playgroud)
但是当我运行我的应用程序时,它似乎是我DbFactory的null并且没有被正确注入,因为我得到一个Null Reference异常.
在ServiceStack应用程序中,我将Funq配置为按请求注入会话,如下所示:
container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB1);
container.Register<NHibernate.ISession>(c => c.Resolve<NHibernate.ISessionFactory>()
.OpenSession())
.ReusedWithin(Funq.ReuseScope.Request);
Run Code Online (Sandbox Code Playgroud)
我的服务看起来像这样,它的工作正常:
public class MyNhAwareService : Service
{
public ISession Session { get; set; }
public object Any(DoSomething request)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我想在其自己的会话工厂中添加第二个NHibernate数据库时,问题就出现了:
container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB1);
container.Register<NHibernate.ISession>(c => c.Resolve<NHibernate.ISessionFactory>()
.OpenSession())
.ReusedWithin(Funq.ReuseScope.Request);
// add a different session factory
container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB2);
Run Code Online (Sandbox Code Playgroud)
我一直在尝试用各种方式Funq可以使用,我想我已经找到了前进的时候,我发现了"RegisterNamed()"方法,但仍然没有帮助,因为我不能用什么除了我的服务中的TryResolve().
这似乎应该是可能的,但是我正在试图解决这个问题.我会非常感激任何建议.