C# 用Ninject传递构造函数

C# 用Ninject传递构造函数,c#,asp.net-mvc,ninject,C#,Asp.net Mvc,Ninject,我有一个基本通用存储库和许多从基本存储库继承的类存储库。我还需要将字符串值传递到通用存储库 这是我的通用存储库 public class Repository<T> where T : EntityBase { private string SessionId; public Repository(string sessionId) { this.SessionId = sessionId;

我有一个基本通用存储库和许多从基本存储库继承的类存储库。我还需要将字符串值传递到通用存储库

这是我的通用存储库

public class Repository<T> where T : EntityBase
    {
        private string SessionId;

        public Repository(string sessionId)
        {
            this.SessionId = sessionId;
        }

        protected virtual IDbConnection GetCn()
        {
            return new SqlConnection(ConfigurationManager.ConnectionStrings["SalesDb"].ConnectionString);
        }

        public virtual int Insert(T entity)
        {
            entity.ChUser = "anders.persson";
            entity.ChTime = DateTime.Now;

            using (IDbConnection cn = GetCn())
            {
                cn.Open();

                return cn.Insert(entity);
            }
        }

        // MORE CODE
        }
    }
public class MarketRepository : Repository<Market>, IMarketRepository
    {

    }
公共类存储库,其中T:EntityBase
{
私有字符串SessionId;
公共存储库(字符串sessionId)
{
this.SessionId=SessionId;
}
受保护的虚拟连接GetCn()
{
返回新的SqlConnection(ConfigurationManager.ConnectionString[“SalesDb”].ConnectionString);
}
公共虚拟整数插入(T实体)
{
entity.ChUser=“anders.persson”;
entity.ChTime=DateTime.Now;
使用(IDbConnection cn=GetCn())
{
cn.Open();
返回cn.Insert(实体);
}
}
//更多代码
}
}
以及界面

public interface IRepository<T>
{
    int Insert(T entity);

}
public interface IMarketRepository : IRepository<Market>
{

}
公共接口IRepository
{
int Insert(T实体);
}
我的类存储库

public class Repository<T> where T : EntityBase
    {
        private string SessionId;

        public Repository(string sessionId)
        {
            this.SessionId = sessionId;
        }

        protected virtual IDbConnection GetCn()
        {
            return new SqlConnection(ConfigurationManager.ConnectionStrings["SalesDb"].ConnectionString);
        }

        public virtual int Insert(T entity)
        {
            entity.ChUser = "anders.persson";
            entity.ChTime = DateTime.Now;

            using (IDbConnection cn = GetCn())
            {
                cn.Open();

                return cn.Insert(entity);
            }
        }

        // MORE CODE
        }
    }
public class MarketRepository : Repository<Market>, IMarketRepository
    {

    }
public类MarketRepository:Repository,IMarketRepository
{
}
以及界面

public interface IRepository<T>
{
    int Insert(T entity);

}
public interface IMarketRepository : IRepository<Market>
{

}
公共界面imarketropository:IRepository
{
}
现在我想将sessionId传递给泛型存储库构造函数。 我该怎么做呢。在这种情况下,我必须在每个类存储库中实现一个构造函数,并将其传递给基础存储库。接口甚至不知道这个构造函数

这是Ninject绑定

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>));
    kernel.Bind<ILeadRepository>().To<LeadRepository>();
    kernel.Bind<IPricelistRepository>().To<PricelistRepository>();
    kernel.Bind<IOptionalGroupRepository>().To<OptionalGroupRepository>();
    kernel.Bind<IProductGroupRepository>().To<ProductGroupRepository>();
    kernel.Bind<IProductRepository>().To<ProductRepository>();
    kernel.Bind<IMarketRepository>().To<MarketRepository>();
    kernel.Bind<IModelRepository>().To<ModelRepository>();
    kernel.Bind<IOrderRepository>().To<OrderRepository>();
}  
私有静态无效注册服务(IKernel内核)
{
Bind(typeof(IRepository)).To(typeof(Repository));
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
}  

会话ID将是一个运行时值,因此您需要在解析时将其传递给ctor。
这样做的语法是:

var reposetory 
    = kernel.Get<IMarketRepository>(new ConstructorArgument("sessionId", sessionId));
工厂:

public class RepositoryFactory : IRepositoryFactory
{
    private IKernel _kernel;

    public RepositoryFactory(IKernel kernel)
    {
        _kernel = kernel;
    }

    public T CreateNew<T>(string sessionId)
    {
        return
            _kernel.Get<T>(new ConstructorArgument("sessionId", sessionId));
    }
}
公共类RepositoryFactory:IRepositoryFactory
{
私有IKernel_内核;
公共存储工厂(IKernel内核)
{
_内核=内核;
}
public T CreateNew(字符串sessionId)
{
回来
_Get(新的构造函数参数(“sessionId”,sessionId));
}
}
用法:

var repository = _repositoryFactory.CreateNew<IMarketRepository>(sessionId);
var repository=\u repositoryFactory.CreateNew(sessionId);

会话ID将是一个运行时值,因此您需要在解析时将其传递给ctor。
这样做的语法是:

var reposetory 
    = kernel.Get<IMarketRepository>(new ConstructorArgument("sessionId", sessionId));
工厂:

public class RepositoryFactory : IRepositoryFactory
{
    private IKernel _kernel;

    public RepositoryFactory(IKernel kernel)
    {
        _kernel = kernel;
    }

    public T CreateNew<T>(string sessionId)
    {
        return
            _kernel.Get<T>(new ConstructorArgument("sessionId", sessionId));
    }
}
公共类RepositoryFactory:IRepositoryFactory
{
私有IKernel_内核;
公共存储工厂(IKernel内核)
{
_内核=内核;
}
public T CreateNew(字符串sessionId)
{
回来
_Get(新的构造函数参数(“sessionId”,sessionId));
}
}
用法:

var repository = _repositoryFactory.CreateNew<IMarketRepository>(sessionId);
var repository=\u repositoryFactory.CreateNew(sessionId);

您可以将其添加到绑定:

Bind<IMarketRepository>().To<MarketRepository>().WithConstructorArgument("sessionId", "Session ID here");
Bind().To().WithConstructorArgument(“sessionId”,“此处的会话ID”);

您可以将其添加到绑定:

Bind<IMarketRepository>().To<MarketRepository>().WithConstructorArgument("sessionId", "Session ID here");
Bind().To().WithConstructorArgument(“sessionId”,“此处的会话ID”);

这假设
内核正在应用程序中传递。。这是不应该的。您需要在靠近
合成根的位置执行此操作。你可以在Ninject绑定中完成它。@Simon:确实应该,我还在完成答案的过程中。我不确定您在绑定中会怎么做,因为“sessionId”是一个运行时值。OP在哪里说它是一个运行时值?无论哪种方式,它都可以在运行时静态地检索..+1以获得一个有趣的解决方案,但由于应用程序与
Ninject
紧密耦合,因此某种程度上违背了DI的目的。我会将
与constructorargument一起使用。@danradu:谢谢。工厂将位于应用程序的
组合根目录
,以及其他DI材料和
抽象工厂
。应用程序的其余部分不知道工厂实现。这假设
内核正在应用程序中传递。。这是不应该的。您需要在靠近
合成根的位置执行此操作。你可以在Ninject绑定中完成它。@Simon:确实应该,我还在完成答案的过程中。我不确定您在绑定中会怎么做,因为“sessionId”是一个运行时值。OP在哪里说它是一个运行时值?无论哪种方式,它都可以在运行时静态地检索..+1以获得一个有趣的解决方案,但由于应用程序与
Ninject
紧密耦合,因此某种程度上违背了DI的目的。我会将
与constructorargument一起使用。@danradu:谢谢。工厂将位于应用程序的
组合根目录
,以及其他DI材料和
抽象工厂
。应用程序的其余部分不知道工厂实现。这会将连接字符串放入“sessionId”参数,这似乎不正确。这是静态连接字符串的正确解决方案,但是这里不知道“sessionId”,因为它是一个运行时值。这只是一个示例(使用OP识别的代码)。我可能会更新它以传递一些随机信息。此外,OP没有提到如何找到
sessionId
。它可以是任何东西。这会将连接字符串放在“sessionId”参数上,这似乎不正确。这是静态连接字符串的正确解决方案,但是这里不知道“sessionId”,因为它是一个运行时值。这只是一个示例(使用OP识别的代码)。我可能会更新它以传递一些随机信息。此外,OP没有提到如何找到
sessionId
。它可能是任何东西。。