Я использую Автофак. Я хочу ввести делегата в класс:
public delegate ValidationResult ValidateAddressFunction(Address address);
public class OrderSubmitHandler
{
private readonly ValidateAddressFunction _validateAddress;
public OrderSubmitHandler(ValidateAddressFunction validateAddress)
{
_validateAddress = validateAddress;
}
public void SubmitOrder(Order order)
{
var addressValidation = _validateAddress(order.ShippingAddress);
if(!addressValidation.IsValid)
throw new Exception("Your address is invalid!");
}
}
Реализация ValidateAddressFunction
, которую я хочу внедрить, исходит из класса, который должен быть разрешен из контейнера, поскольку у него есть собственные зависимости:
public class OrderValidator
{
private readonly ISomeDependency _dependency;
public OrderValidator(ISomeDependency dependency)
{
_dependency = dependency;
}
public ValidationResult ValidateAddress(Address address)
{
// use _dependency
// validate the order
// return a result
return new ValidationResult();
}
}
В этом примере я использую делегат, но с тем же успехом я мог бы внедрить Func<Address, ValidationResult>
.
Я мог бы просто внедрить OrderValidator
, но я бы не стал создавать интерфейс только с одним методом. Если все, что нужно моему классу, - это один метод, то я бы предпочел напрямую зависеть от него.
Как зарегистрировать делегат или Func
таким образом, чтобы при его разрешении класс, содержащий метод, был разрешен, а затем я мог использовать метод из разрешенного экземпляра?