About .NET, ASP.NET, MVC, C#, WPF, WCF and everything related to .NET and more.

Mugen Injection [Внедрение зависимостей в свойства и методы]

Внедрение зависимостей в свойства и методы используется вместо внедрения зависимостей через конструктор.

Используем атрибут

Для того чтобы осуществить внедрение зависимостей через свойства и методы, вам необходимо пометить свойство или метод атрибутом IInjectorSetting.AttributeForInject, по умолчанию используется MugenInjection.Attributes.InjectAttribute.
Пример кода:
public sealed class MyInjectAttribute : Attribute { }

public class InjectAttributeExample
{
    [Inject]
    public string Property { get; set; }

    [Inject]
    public void Method(string method)
    {

    }

    [MyInject]
    public string PropertyCustomAttr { get; set; }

    [MyInject]
    public void MethodCustomAttr(string method)
    {

    }
}

// Create your MugenInjector.
_injector = new MugenInjector();
_injector.Bind<string>().ToConstant("test");

var injectAttributeExample = _injector.Get<InjectAttributeExample>();

_injector.Settings.AttributeForInject = typeof (MyInjectAttribute);
injectAttributeExample = _injector.Get<InjectAttributeExample>();

Используем "IActivator"

Если атрибут не подходит для вашего случая, вы можете использовать свою реализацию IActivator для активации компонента, пример кода демонстрирует IActivator, который используется для интеграции с NServiceBus:
public class ObjectBuilderActivator : ExpressionActivator
{
    #region Fields

    private Type _serviceType;
    private List<PropertyInfo> _cachedProperty;

    #endregion

    #region Method

    private IEnumerable<PropertyInfo> GetProperties(Type service)
    {
        if (_serviceType != service)
        {
            _serviceType = service;
            _cachedProperty = service.GetProperties(BindingFlags).ToList();
            return _cachedProperty;
        }
        return _cachedProperty;
    }

    #endregion

    #region Overrides of ActivatorBase

    protected override bool IsHasValuesToInject(Type service, Type attributeType)
    {
        return true;
    }

    protected override IList<PropertyInfo> GetPropertiesToInject(Type service, Type attributeType)
    {
        IList<PropertyInfo> propertiesToInject = base.GetPropertiesToInject(service, attributeType);
        foreach (PropertyInfo propertyInfo in GetProperties(service))
        {
            if (propertiesToInject.Contains(propertyInfo)) continue;
            if (CurrentContext.Parameters.Any(parameter => parameter.CanResolve(propertyInfo, null)))
            {
                propertiesToInject.Add(propertyInfo);
                continue;
            }
            if (!CurrentContext.CallInjector.CanResolve(propertyInfo.PropertyType, true, false)) continue;
            propertiesToInject.Add(propertyInfo);
        }
        return propertiesToInject;
    }

    #endregion
}
Также вы можете указать, чтобы IInjector использовал ваш IActivator для всех IBinding:
// Create your MugenInjector.
_injector = new MugenInjector();
_injector.Bind<Bravo>().ToSelf().UseCustomActivator(new ObjectBuilderActivator());
Более подробнее об IActivator смотреть здесь.

Комментарии
Оставить комментарий
*bold*
_italics_
+underline+
* Bullet List
** Bullet List 2
# Number List
## Number List 2
{"Do not apply formatting"}
{code:language} code here {code:language}.
Supports: aspx c#, c#, c++, html, sql, xml
[url:http://www.example.com]