Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.NET MVC Dependency Injection on Models?

Question: Is there a way to use Ninject to inject dependencies into my MVC Models?

First of all, I am new to MVC and DI (and stackoverflow, btw), so I wanted to make sure I'm going down the proper path with this problem. I've been Googling the answer for days, but I can't find a clean explanation... I'm using C#, .NET4, MVC3, Ninject, and VS2010.

Here's the scenario: I have a new user form where a user can set their login, roles, and set other profile data. When this gets submitted, I need to save the login info to the MembershipProvider, the roles to the RoleProvider, etc... Its gets a little hairy because I am using dual providers (Active Directory / local database) as per my project requirements, so there is a bit of logic in determining which provider to save to, if the user already exists, if they are allowed to self-identify any roles, and so on.

I feel like this logic should go in a .Save() method on my model. However, I then need to inject instances of my providers into my model, and Ninject doesn't seem to inject models (at least not using the default setup that the NuGet package comes with). Hence my initial question.

I can think of some alternatives...

  1. Maybe the model is a bad place for this logic to begin with and I should abstract the logic into a service? But making a service just for this one save function seems like overkill to me.
  2. I could just eat the bloat in my controller...but I am told that "fat" controllers are a bad practice.
  3. I suppose I could instead inject my providers into my controller, and then pass those dependencies to my model, but that seems a bit wonky.

So... Is there a way to Ninject the model or do I need to re-factor because I am a newbie at this?

like image 864
jrizzo Avatar asked Jun 23 '11 23:06

jrizzo


Video Answer


1 Answers

I would go with option one. It's not overkill - adding a class and an interface is just a few lines of code and it keeps your implementation neat, and maybe later you will want to add more methods... update a user?

Add an interface and class to handle this which your controller uses - ninject will fetch this instance for you. I have written IMembershipAndRoleService as an example.

public interface IMembershipAndRoleService
{
    void ProcessNewUser(User newUser);
}

public class YourController : Controller
{
    private readonly IMembershipAndRoleService _membershipAndRoleService;

    public YourController(IMembershipAndRoleService membershipAndRoleService)
    {
        _membershipAndRoleService = membershipAndRoleService;
    }

    [HttpPost]
    public ActionResult NewUserFormAction(NewUserForm newUserForm)
    {
        //process posted form, possibly map / convert it to User then call to save
        _membershipAndRoleService.ProcessNewUser(user);
        //redirect or return view
    }
}

Lastly make the class which implements IMembershipAndRoleService, this class will use your Membership and Role providers OR other interfaces which do, keeping your logic in this class simplified.

like image 130
CRice Avatar answered Oct 13 '22 23:10

CRice