/ / Правилен начин за създаване на обекти при необходимост - asp.net-mvc, инжектиране на зависимост, ninject

Правилен начин за създаване на обекти, когато е необходимо - asp.net-mvc, зависимост-инжектиране, ninject

Уча Ninject като мой първи контейнер DI, предполагам, че всички контейнери ще имат подобна идея, така че ето въпросът ми.

Имам клас UserRepository, който има функция:

//constructor
public UserRepository(Kernel kernel) { _kernel = kernel; }

public UserDataModel CreateNewUser(string title, string firstname,
string lastname, int age ...)
{
//I have the kernel registered everything properly
//Getting a new user object from the kernel
var user = _kernel.Get<UserDataModel>();

user.Title = title;
user.Firstname = firstname;
user.Lastname = lastname;
...
return user;
}

Правилен ли е начинът да се използва ядрото? Четох от други публикации, че излагането и прехвърлянето около ядрото е лоша лоша идея. Ако е така, какъв е правилният начин да го направите?

РЕДАКТИРАНЕ

някои от кода ми, демонстриращи използването на обект tempUser

public int UpdateSaUser(Guid msuserid, UserProfile saprofile,
string accesstoken = "")
{
using (var db = new SaModelContainer())
{
var row1 = MakeNewRow(msuserid, saprofile, accesstoken);
var row2 = db.SaUser.SingleOrDefault(
r => r.MsUserId.Equals(msuserid));
if (row2 == null) { //add new
db.sauth_User.Add(row1);
} else { //modify
var entry = db.Entry(row2);
entry.OriginalValues.SetValues(row2);
entry.CurrentValues.SetValues(row1);
}
return db.SaveChanges();
}
}

private SaUser MakeNewRow(Guid msuserid, UserProfile saprofile,
string accesstoken = "")
{
var row = new SaUser {
MsUserId = msuserid,
Provider = (int)saprofile.Provider,
ProfileId = saprofile.ID,
Email = saprofile.Email,
AccessToken = accesstoken,
FirstName = saprofile.FirstName,
LastName = saprofile.LastName,
FullName = saprofile.FullName,
UserName = saprofile.Username,
DisplayName = saprofile.DisplayName,
Country = saprofile.Country,
DoB = StringParser.ParseDate(saprofile.DateOfBirth),
Gender = (int)saprofile.GenderType,
Language = saprofile.Language,
ProfileURL = saprofile.ProfileURL,
ProfilePictureURL = saprofile.ProfilePictureURL
};

return row;
}

Отговори:

2 за отговор № 1

Трябва да инжектирате вашите зависимости, също познати като инжектиране на зависимост. Вместо да инжектирате ядрото.

Пример (това е познато като инжектиране на конструктора):



private UserDataModel _userDataModel;

[Inject]
public UserRepository(UserDataModel userDataModel)
{
_userDataModel = userDataModel;
}

//Any other method can now use _userDataModel

Вероятно трябва да направите интерфейс на своя UserDataModel така че можете да се подигравате или да я заглушавате в тестовете си. И свържете този интерфейс с правилното изпълнение, използвайки ninject вижте примера. Тогава няма нужда от атрибутите.

Ninject MVC Documentation

Добър пример за MVC

Списък на UserDataModels не е зависимост. Т.Е. Имате някаква база данни или друга зависимост (WCF Service, Web Service, Entity Framework, nHibernate, ...), където потребителите идват от това е вашата зависимост.



public UserRepository(EntityFrameworkContext context)
{
//The entity framework context is the dependency that you don"t want to test.
_context = context;
}

public List GetAllUsers()
{
return _context.Users.ToList();
}