如何在mvc中实现依赖注入?

时间:2016-04-03 18:38:57

标签: asp.net-mvc dependency-injection

我正在尝试实现依赖注入但我知道如何实现类的接口和存储库然后我不知道该怎么办。 这是我的样本:

 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());
    }

下一步是什么?

2 个答案:

答案 0 :(得分:1)

首先,摆脱我们正在编写UserRepository初始化的默认构造函数!我们将以依赖注入方式执行此操作。

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

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

现在我们需要告诉MVC框架代码运行时应该使用IUser的哪个版本/实现。你可以使用任何依赖注入框架来做到这一点。例如,如果您在MVC 6中,则可以使用inbuilt dependency injection framework来执行此操作。所以转到你的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时,您可以在配置文件中执行类似的操作(Web配置或用于统一配置的外部配置文件)

<强>统一

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

答案 1 :(得分:0)

为了使用Spring DI(依赖项功能)创建和配置项目,您必须配置bean。 Create an xml file (if its not there) and add references to 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);
  

你不要创建这个类的实例。