Я хотел бы получить совет о том, каков наилучший подход между этими двумя решениями:
с использованием единицы я регистрирую N интерфейсов / классов служб
internal class Configurator
{
private static IUnityContainer container = new UnityContainer();
internal static void Configure()
{
container.RegisterType<ICustomerService, CustomerService>();
container.RegisterType<IPhoneService, PhoneService>();
container.RegisterType<IUserService, UserService>();
...
}
internal static T Resolve<T>()
{
return container.Resolve<T>();
}
}
Где все интерфейсы реализуют IService
public interface ICustomerService : IService
public interface IPhoneService: IService
public interface IUserService: IService
Я также создал класс ServiceFactory
public class ServiceFactory : IServiceFactory
{
public T GetService<T>() where T : IService
{
return Configurator.Resolve<T>();
}
}
, теперь я сомневаюсь:
РЕШЕНИЕ 1:
public class TestViewModel
{
private ICustomerService _customerService;
private IPhoneService _phoneService;
private IUserService _userService;
public TestViewModel(ICustomerService customerService, IPhoneService phoneService, IUserService userService)
{
_customerService = customerService;
_phoneService = phoneService;
_userService = userService;
}
РЕШЕНИЕ 2:
public class TestViewModel
{
private IServiceFactory _serviceFactory;
private IUserService _userService;
public IUserService UserService
{
get
{
if(_userService == null)
_userService = _serviceFactory.GetService<IUserService>();
return _userService;
}
}
public MainWindowViewModel(IServiceFactory serviceFactory)
{
_serviceFactory = serviceFactory;
}
Лично я предпочитаю решение 2, потому что
1) если мне нужно внедрить много услуг в одном конструкторе, я могу внедрить только фабрику
2)сервисы инициализируются только по запросу (в решении 1 они все инициализируются в конструкторах, даже если пользователь никогда не будет вызывать / использовать их все)
Согласны ли вы с тем, что решение 2 лучше? Есть ли противопоказания? Iхочу услышать ваше мнение ...