Re[8]: О "наивном" DI и об архитектурном бессилии
От: · Великобритания  
Дата: 22.09.16 11:17
Оценка:
Здравствуйте, #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();

Почему редко такой код встречается?..
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.