как реализовать инъекцию зависимостей в mvc?

59
8

Я пытаюсь внедрить инъекцию зависимостей, но я знаю, как реализовать интерфейс и хранилище классов, тогда я не знаю, что мне делать. Это мой пример:

 public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string LastName { get; set; }
}

Это мой интерфейс:

public interface IUser
{
IEnumerable<User> GetUsers();
void AddUser(User user);
void EditUser(User user);
void DeleteUser(int id);
User UserGetById(int id);
void Save();
}

Это мой репозиторий:

  public class UserRepsitory:IUser
{
private _Context _context;
public UserRepsitory(_Context _context)
{
this._context = _context;
}
public IEnumerable<User> GetUsers()
{
return _context.User.ToList();
}
public void AddUser(User user)
{
_context.User.Add(user);
}
public void EditUser(User user)
{

_context.Entry(user).State = System.Data.Entity.EntityState.Modified;
}
public User UserGetById(int id)
{
return _context.User.Find(id);
}
public void Save()
{
_context.SaveChanges();
}
public void DeleteUser(int id)
{
var Search = _context.User.Find(id);
_context.User.Remove(Search);

}
}

И один из методов в контроллере:

  private IUser userRepsitory;

public UsersController()
{
this.userRepsitory = new UserRepsitory(new _Context());
}

public UsersController(IUser UserRepository)
{
this.userRepsitory = UserRepository;
}

public ActionResult Index()
{
return View(userRepsitory.GetUsers());
}

Каким будет следующий шаг?

спросил(а) 2016-04-03T21:38:00+03:00 4 года, 6 месяцев назад
1
Решение
59

Во-первых, избавиться от конструктора по умолчанию, где мы жестко кодируем инициализацию UserRepository ! Мы сделаем это в режиме инъекции зависимостей.

public UsersController : Controller
{
private readonly IUser userRepsitory;
public UsersController(IUser UserRepository)
{
this.userRepsitory = UserRepository;
}

public ActionResult Index()
{
return View(userRepsitory.GetUsers());
}
}

Теперь нам нужно что-то сказать структуре MVC, какую версию/реализацию IUser следует использовать при IUser кода. вы можете использовать любую инфраструктуру инъекций зависимостей для этого. Например, если вы находитесь в MVC 6, вы можете использовать встроенную инфраструктуру внедрения зависимостей для этого. Итак, перейдите в свой класс Startup и в свой метод ConfigureServices, вы можете сопоставить интерфейс с конкретной реализацией.

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IUser, UserRepository>();
}
}

Если вы находитесь в предыдущей версии MVC, вы можете подумать об использовании любой из инфраструктур инъекций зависимостей, доступных как Unity, Ninject и т.д.

Это почти то же самое, вы сопоставляете интерфейс с конкретной реализацией

Ninject

private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUser>().To<UserRepository>();
}

Вам не нужно помещать сопоставление в файл cs. Вы можете определить это в файле конфигурации. Например, когда вы используете Unity, вы можете сделать что-то подобное в своем конфигурационном файле (веб-конфиг или внешний файл конфигурации для конфигурации с единством)

Единство

<alias alias="IUser" type="YourNamespace.IUser, YourAssemblyName" />
<register type="IUser" mapTo="YourNamespace.UseRepository, YourAssemblyName">

ответил(а) 2016-04-03T21:50:00+03:00 4 года, 6 месяцев назад
41

Чтобы создать и настроить проект с помощью Spring DI (функция зависимостей), вы должны настроить beans. Создайте xml файл (если его нет) и добавьте ссылки на bean-компонент

В этом XML файле укажите ссылки на классы, которые вы хотите ввести. Пример:

<bean id="Name of the JAVA Class" class="the Full path of the JAVA class"/>

И в вашем классе, где вы должны назвать ссылочный класс (см. Выше), процедура вызова будет выглядеть так:

@Controller
public class MyController {

private full.path.of.my.class.named.MyJavaClass _class;

@Autowired
private MyController (full.path.of.my.class.MyJavaClass class)
{
this._class= class;
}
}

Теперь скажите, есть ли функция в MyJavaClass

public int sum(int x, int y){
return x+y;
}

Затем, не создавая объект MyJavaClass, вы можете ввести в контроллер следующее:

_class.Sum(10,15);

ВЫ НЕ СОЗДАВАЕТ ИНСТАНЦИЮ ЭТОГО КЛАССА.

ответил(а) 2016-04-28T09:54:00+03:00 4 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема