Запутался в инъекции зависимостей - PullRequest
3 голосов
/ 07 марта 2011

Я новичок в MVC и внедрение зависимостей.Пожалуйста, помогите мне понять, как это должно работать.Я использую Ninject.Вот мой код:

в файле Global.asax:

private void RegisterDependencyResolver()
    {
        var kernel = new StandardKernel();
        kernel.Bind<IDbAccessLayer>().To<DAL>(); 
        // DAL - is a Data Access Layer that comes from separated class library 
        DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
    }

protected void Application_Start()
    {
        RegisterDependencyResolver();
    }

Реализация IDbAccessLayer очень проста:

public interface IDbAccessLayer
{
  DataContext Data { get; }
  IEnumerable<User> GetUsers();
}

теперь в контроллере мне нужно создатьконструктор, который получает IDbAccessLayer param.И это просто работает.

Теперь я не знаю, как передать строку подключения в DAL.если я пытаюсь заменить конструктор DAL чем-то, что принимает параметр, это не сработает.Выдает исключение с сообщением Для этого объекта не определен конструктор без параметров

Ответы [ 4 ]

5 голосов
/ 07 марта 2011

Вы можете указать параметры конструктора:

kernel
    .Bind<IDbAccessLayer>()
    .To<DAL>()
    .WithConstructorArgument("connectionString", "YOUR CONNECTION STRING HERE");

И вместо жесткого кодирования строки подключения в вашем Global.asax вы можете прочитать ее из вашего web.config, используя:

ConfigurationManager.ConnectionStrings["CNName"].ConnectionString

и теперь ваш класс DAL может принять строку подключения в качестве параметра:

public class DAL: IDbAccessLayer
{
    private readonly string _connectionString;
    public DAL(string connectionString) 
    {
        _connectionString = connectionString;
    } 

    ... implementation of the IDbAccessLayer methods
}
1 голос
/ 07 марта 2011

Создайте конструктор без параметров, который вызывает конструктор с одним параметром со строкой соединения по умолчанию.

public DAL() : this("default connection string") {

}

public DAL(string connectionString) {
    // do something with connection string
}
0 голосов
/ 07 марта 2011

Просто глупая идея, не зная ни о чем:

kernel.Bind<IMyConnectionString>().To<MyConnectionString>();

И вашему конструктору DAL, принимающему IMyConnectionString

0 голосов
/ 07 марта 2011

Я не работал с ninject, просто с Unity. Но все контейнеры IOC, похоже, тяготеют к тому, чтобы вы создали свой собственный фабричный класс, который принимает ваши параметры с состоянием (строку подключения), которая возвращает ваш реальный объект. Например, если у вас есть класс Person, который требует «имя» и «возраст» для конструктора, то вы должны создать фабрику, которая будет взаимодействовать с Unity, а именно так:

IPerson foo = container.Resolve<IPersonFactory>().Create("George", 25);

Это одна из вещей, которые мне не нравятся в контейнерах IOC, но, как правило, куда они идут ...

...