Я пишу некоторые настраиваемые серверные элементы asp.net и ищет наилучшую практику в том, как вводить зависимость, которую требует контроль.Инъекция зависимостей в пользовательском контроле сервера ASP.NET
При решении вопроса о том, как это сделать, есть несколько факторов, которые я принимаю во внимание:
1) Как легко было бы внедрить эту зависимость с помощью разметки.
2) Насколько легко было бы вводить эту зависимость через код.
3) Эта инъекция должна быть как можно раньше в жизненном цикле управления, предпочтительно, чтобы элемент управления имел все свои зависимости, доступные в OnInit().
Основы на эти факторы, единственный способ, которым я могу думать делать это так есть строковое свойство в элементе управления, который будет иметь полностью качества типа в зависимости. После инициализации элемента управления он может загружать этот тип и делать то, что ему нужно.
Пример:
public class MyControl : CompositeControl
{
public string RepositoryType { get; set; }
protected IRepository Repository { get; set; }
protected override void OnInit()
{
EnsureChildControls();
}
protected override void CreateChildControls()
{
if (!ChildControlsCreated)
{
Repository = ComponentFactory.Instanciate(RepositoryType);
}
}
}
Я бегу в такой ситуации все время и было интересно, если кто-то выяснял другой/лучше/отличается вводить зависимость.
Спасибо :)
Обсуждались ли вы какие-либо схемы внедрения Injection, такие как Unity или NInject? Они автоматически вводят конкретный класс для вас во время выполнения на основе того, как вы его настраиваете. –
На данный момент я бы предпочел не добавлять в систему еще одну переменную (фреймворк). Может быть, в будущем я проверю их. – BlueChameleon
Это зависит от того, как вы создаете элемент управления. Если он динамически загружается через код, то инъекция зависимостей работает по-разному, если вы должны позволить серверу загружать его с помощью asp-тега (в одном из них у вас есть экземпляр, другой - за кулисами). Если вы загружаете с помощью asp-тега, в некоторых рамках вы можете применить к свойству атрибут, например '[Inject]', чтобы сообщить инжектору, какие зависимости нужно заполнить. – Matthew