我有一个基本通用存储库和许多继承自基本存储库的类存储库。我还需要将字符串值传递给通用存储库。
这是我的通用存储库
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 interface IRepository<T>
{
int Insert(T entity);
}
My Class Repository
public class MarketRepository : Repository<Market>, IMarketRepository
{
}
界面
public interface IMarketRepository : IRepository<Market>
{
}
现在我想将sessionId传递给Generic Repositories构造函数。 我怎样才能做到这一点。在这种情况下,我必须在每个类存储库中实现一个构造函数,并将其传递给基本存储库。接口甚至都不知道那个构造函数。
这是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>();
}
答案 0 :(得分:2)
sessionId
将是运行时值,因此您需要在解析时将其传递给ctor。
这样做的语法是:
var reposetory
= kernel.Get<IMarketRepository>(new ConstructorArgument("sessionId", sessionId));
鉴于您不想使用Service Locator,直接调用Get
,而是使用ctor注入,您可以将其封装在工厂内。
配置:
kernel.Bind<IRepositoryFactory>().To<RepositoryFactory>()
.WithConstructorArgument("kernel", kernel);
厂:
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));
}
}
用法:
var repository = _repositoryFactory.CreateNew<IMarketRepository>(sessionId);
答案 1 :(得分:2)
您可以将其添加到绑定中:
Bind<IMarketRepository>().To<MarketRepository>().WithConstructorArgument("sessionId", "Session ID here");