C# 带单例的Structuremap泛型类型

C# 带单例的Structuremap泛型类型,c#,generics,structuremap,C#,Generics,Structuremap,我有一个问题,我想使用StructureMap创建单例,但StructureMap会创建多个实例。当我试图阅读StructureMap上关于如何正确处理泛型的文档时,我感到困惑 我必须为给定实体实例化一个存储库,同时为由于泛型而需要实体类型的数据连接提供一个实例 这是我为VendorRepository编写的代码,许多其他存储库的结构与此完全相同。iVENDORepository需要与供应商类型一起注入IRepository。我不太确定如何以单件方式实现这一点 public interface

我有一个问题,我想使用StructureMap创建单例,但StructureMap会创建多个实例。当我试图阅读StructureMap上关于如何正确处理泛型的文档时,我感到困惑

我必须为给定实体实例化一个存储库,同时为由于泛型而需要实体类型的数据连接提供一个实例

这是我为VendorRepository编写的代码,许多其他存储库的结构与此完全相同。iVENDORepository需要与供应商类型一起注入IRepository。我不太确定如何以单件方式实现这一点

public interface IVendorRepository {
    ...
}

public class VendorRepository : IVendorRepository {
    private readonly IRepository<Vendor> _repository;

    public VendorRepository(IRepository<Vendor> repository)
    {
        _repository = repository;
    }

    ...
}

public class Vendor : DomainEntity
{
    ...
}

public class DomainEntity : IDomainEntity
{
    ...
}
公共接口IVendorrestory{
...
}
公共类供应商存储:IVendorRepository{
专用只读IRepository存储库;
公共供应商存储库(电子存储库)
{
_存储库=存储库;
}
...
}
公共类供应商:DomainEntity
{
...
}
公共类DomainEntity:IDomainEntity
{
...
}
下面是数据连接部分的示例。SqlRepository通过currentSession处理实际连接。据我所知,每个DomainEntity存储库(如VendorRepository)都需要自己的SqlRepository实例

public class SqlRepository<T> : IRepository<T> where T : class, IDomainEntity
{
    private readonly ISession _currentSession;

    public SqlRepository(ISession currentSession)
    {
        _currentSession = currentSession;
    }
    ...
}

public interface IRepository<T> where T : IDomainEntity
{
    ...
}
public类SqlRepository:IRepository其中T:class,IDomainEntity
{
专用只读会话_currentSession;
公共SqlRepository(ISession currentSession)
{
_当前会话=当前会话;
}
...
}
公共接口i位置,其中T:IDomainEntity
{
...
}
最后,这里是今天一切都准备就绪的地方。使用此代码,每次注入VendorRepository时,都会创建一个新实例

For(typeof(IRepository<>)).Use(typeof(SqlRepository<>));

For<ISessionSource>()
    .Use(context => ConfigurationSettings.RunAgainstLocalDatabase
        ? (ISessionSource) context.GetInstance<LocalSessionSource>()
        : (ISessionSource) context.GetInstance<LiveSessionSource>());

For<ISession>()
    .HybridHttpOrThreadLocalScoped()
    .Use(context => context.GetInstance<ISessionSource>().OpenSession());
For(typeof(IRepository))。使用(typeof(SqlRepository));
For()
.Use(上下文=>ConfigurationSettings.RunAgainstLocalDatabase
?(ISessionSource)context.GetInstance()
:(ISessionSource)context.GetInstance());
For()
.HybridHttpOrthReadLocalScope()文件
.Use(context=>context.GetInstance().OpenSession());
当我尝试在这里使用单例时,我当前的会话被NHibernate关闭

For(typeof(IRepository<>)).Singleton().Use(typeof(SqlRepository<>));
For(typeof(IRepository)).Singleton().Use(typeof(SqlRepository));
编辑: 我不完全确定这是否可行,因为我有大量的存储库和实体。但我目前正试图手动添加这些,以测试它是否有效。我的最终目标是拥有所有实体存储库(如VendorRepository)的单例

() .HybridHttpOrthReadLocalScope()文件 .Use(context=>newsqlrepository( context.GetInstance().OpenSession() )); 再次编辑: 这似乎更准确。。虽然我还是不太确定

For<IVendorRepository>()
    .HybridHttpOrThreadLocalScoped()
    .Use(context => new VendorRepository(new SqlRepository<Vendor>(context.GetInstance<ISessionSource>().OpenSession())));
() .HybridHttpOrthReadLocalScope()文件 .Use(context=>newvendorrepository(newsqlrepository(context.GetInstance().OpenSession())); 最终编辑: 以下是每个存储库需要执行的操作。我不知道如何做到这一点,而不按照下面(~100)列出每个存储库。然而,在有限的测试中,对于每个依赖项注入使用单例而不是新实例并没有明显的性能提高。除非有更简单的方法让StructureMap提取存储库并自动正确地绑定它们,否则我将保留它创建多个实例的方式,而不是尝试列出以下代码的大约100个几乎相同的副本

For<IVendorRepository>()
        .HybridHttpOrThreadLocalScoped()
        .Singleton()
        .Use(context => new VendorRepository(
            new SqlRepository<Vendor>(context.GetInstance<ISession>())
        ));
() .HybridHttpOrthReadLocalScope()文件 .Singleton() .Use(context=>newvendorrepository( 新的SqlRepository(context.GetInstance()) ));
你能举个例子,说明如果你是手工操作的话,你将如何连接(创建对象图)吗?这将有助于我们理解您试图实现的目标。当然,我添加了更多关于如何创建图形以及我正在尝试的内容。我对structuremap很陌生,已经离开国际奥委会一段时间了,所以我的方法可能有点偏离了基础。
For<IVendorRepository>()
        .HybridHttpOrThreadLocalScoped()
        .Singleton()
        .Use(context => new VendorRepository(
            new SqlRepository<Vendor>(context.GetInstance<ISession>())
        ));