Здравствуйте, #John, Вы писали:
J>>>И зачем все эти сложности с интерфейсами, рефлексией? почему бы просто не написать: new UserManager().Save(user);
J>·>Ок. Давай по шагам. Где именно ты хочешь это написать? И что делать с зависимостями самого UserManager? Например, ему может понадобиться DbConnection и SomeUserConfigParams, а DbConnection тянет за собой ConnectionParams.
J>Допустим проект(другой) из двух либ:
Ещё хуже.
J>1. Там где находятся MVC котроллеры,Global.asax.
J>J> var s = new UserService();
J> return s.Save(user);
J>
И какой тут смысл создавать инстанс UserService? Чем UserService.Save со статическим методом хуже?
J>2. Вторая либа Domain:
J>Где находятся *Service *Managers. UserService имеет обслужываеющий код(логирование, ловлю ошибок, создания ResponceResult), простую бизнес логику, и UserService дергает методы UserManage для извлечения данных из бд, выполнения sql процедур.
J>
J> using (var someContext = new SomeContext())
J> {
J> var userManager =new UsersManager(ibeaconContext);
Не понял. Что за ibeaconContext? Где DbConnection и ConnectionParams?
J>Как передать SomeUserConfigParams .
J>Создать Singleton с этим объектом в Domain либе.
J>И теперь при создании new UserService.Save() метода как-то инициализировать Singleton.
Т.е. у тебя все зависимости будут синглтонами. Правильно понял? Жуть же. Типичный спагетти-код и радости дебага правильности порядка инициализации синглтонов.
А теперь посмотрим на DI здорового человека:
public class UserRestController
{
private const UserService userService;
public UserRestController(UserService userService) {this.userService = userService;}
[HttpPost]
[ActionName("save")]
public ResponceResult Save(UserModel user){
return userService.Save(user);
}
}
public class UserService {
private const DbConnection connection;
private const UserManager userManager;
public UserService(DbConnection connection, UserManager userManager) {this.connection = connection; this.userManager = userManager;}
public ResponceResult Save(UserModel usermodel){
try
{
if (!usermodel.IsValid())
{
return new ResponceResult { ... };
}
using (var txn = new TransactionContext(connection))
{
var users = userManager.List();
...
/// validate data, save data.
txn.commit();
return new ResponceResult() {... };
}
}
catch (Exception ex)
{
return new ResponceResult { ...};
}
}
}
И отдельно где-нибудь в Global делаем явный wiring:
var someUserConfigParams = readParamsFromConfigFile();
var connectionParams = readConnectionParamsFromAnotherConfigSource();
var dbConnection = new DbConnection(connectionParams);
var userManager = new UserManager(someUserConfigParams);
var userService = new UserService(dbConnection, userManager);
var userRestController = new UserRestController();
var HttpServer server = new HttpServer();
server.addHandler(userRestController);
server.start();
Почему редко такой код встречается?..