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
。它可能是任何东西。。