Вы делаете:
new DataContext(connectionString)
в вашем коде - это самое нововведение и привязка к классам, которые вы пытаетесь вытолкнуть из своего кода с помощью контейнера DI. По крайней мере, подумайте о добавлении интерфейса IConnectionStringSelector
или чего-то подобного. Вы не хотите иметь 20 вызовов Bind
для 20 репозиториев - вам нужна абстракция более высокого уровня, чем эта.
Я бы посоветовал лучшее решение - требовать либо IDataContext
или IDataContextFactory
в конструкторе вместо этого, позволяя этому беспокоиться об этом.
Вы можете указать строку подключения в качестве аргумента конструктора при привязке SqlProductRepository
к интерфейсу IProductRepository
.
public class LinqToSqlModule : NinjectModule
{
public override void Load()
{
Bind<IProductRepository>().To<SqlProductRepository>()
.WithConstructorArgument(connectionString, "connectionstring");
}
}
Я бы предложил немного другое подходить. Прежде всего, вы можете захотеть создать привязку для класса DataContext
в ядре. Вы можете сделать это, используя класс провайдера для создания своего DataContext
, передав строку подключения в качестве аргумента его конструктору. Затем вы привязываете DataContext
к DataContextProvider
.
public class DataContextProvider : Provider<DataContext>
{
protected override DataContext CreateInstance(IContext context)
{
string connectionString = "connectionstring";
return new DataContext(connectionString);
}
}
public class LinqToSqlModule : NinjectModule
{
public override void Load()
{
Bind<DataContext>().ToProvider<DataContextProvider>();
Bind<IProductRepository>().To<SqlProductRepository>();
}
}
Затем модифицируйте конструктор класса SqlProductRepository
, чтобы вместо этого он принял объект DataContext
.
public class SqlProductRepository : IProductRepository
{
private readonly DataContext context;
public ProductRepository(DataContext context)
{
this.context = context;
}
public IQueryable<Product> Products
{
get { return context.GetTable<Product>(); }
}
}
Кстати, вам не нужно украшать свой конструктор атрибутом Inject
.
Вы можете настроить его в своей привязке
_kernel.Bind<IProductRepository>()
.To<SqlProductRepository>()
.WithConstructorArgument("connectionString",yourConnectionString );