Re: IoC/DI support in Apache Ignite.NEt

2018-09-13 Thread Pavel Tupitsyn
Looks good to me in general.

But we should add IDependencyResolver {get;set} to IgniteConfiguration
class instead of changing IIgnite interface.
We need the resolver at startup before IIgnite instance is created, to
resolve user-defined cache stores and so on.

And we should make sure to add tests for all kinds of user-defined classes
that are instantiated by Ignite:
Compute jobs, actions, services, cache stores, ICacheEntryFilter,
ICacheEntryProcessor, etc.

Thanks,
Pavel

On Thu, Sep 13, 2018 at 4:03 PM Artyom Sokolov  wrote:

> Hello,
>
> I propose the following.
>
> *Development*
>
> 1. Define *IDependencyResolver* in *Apache.Ignite.Core* under
> *DependencyInjection* folder that contains at least 2 methods:
>
> *T Resolve(object arguments = null);*
> *object Resolve(Type type, object arguments = null);*
>
> 2. Create *InjectResolvableAttribute* in Apache.Ignite.Core under
> *DependencyInjection* folder marked with
> *[AttributeUsage(AttributeTargets.Field
> | AttributeTargets.Property)]*
> 3. Create internal static class *DependencyInjector* with at least one
> internal static method that will inject required dependencies in service
> implementations like this one (exception checking is omitted currently and
> has to be added)
>
> *namespace Apache.Ignite.Core.DependencyInjection*
> *{*
> *using System.Linq;*
> *using System.Reflection;*
> *using Apache.Ignite.Core.Services;*
>
> *internal static class DependencyInjector*
> *{*
> *internal static void Inject(IService svc, IIgnite ignite)*
> *{*
> *var dependencyResolver = ignite.GetDependencyResolver();*
>
> *if (dependencyResolver == null)*
> *{*
> *return;*
> *}*
>
> *foreach (var property in svc.GetType()*
> *.GetProperties(BindingFlags.Public |
> BindingFlags.NonPublic | BindingFlags.Instance))*
> *{*
> *if
> (!property.GetCustomAttributes(typeof(InjectResolvableAttribute),
> true).Any())*
> *{*
> *continue;*
> *}*
>
> *if (!property.CanWrite)*
> *{*
> *continue;*
> *}*
>
> *var resolvedDependency =
> dependencyResolver.Resolve(property.PropertyType);*
> *property.SetValue(svc, resolvedDependency, null);*
> *}*
>
> *foreach (var field in svc.GetType()*
> *.GetFields(BindingFlags.Public | BindingFlags.NonPublic |
> BindingFlags.Instance))*
> *{*
> *if
> (!field.GetCustomAttributes(typeof(InjectResolvableAttribute),
> true).Any())*
> *{*
> *continue;*
> *}*
>
> *var resolvedDependency =
> dependencyResolver.Resolve(field.FieldType);*
>
> *field.SetValue(svc, resolvedDependency);*
> *}*
> *}*
> *}*
> *}*
>
> 4. Add* DependencyInjector.Inject(svc, _ignite);* call to
> *UnmanagedCallbacks.cs* right after *ResourceProcessor.Inject(svc,
> _ignite)*
> .
> 5. Add 2 methods to *Ignite* class and it's interface *IIgnite*:
>
> *public IDependencyResolver GetDependencyResolver();*
> *public IIgnite SetDependencyResolver(IDependencyResolver
> dependencyResolver);*
>
> 6. Create *Apache.Ignite.DependencyInjection.CastleWindsor* project and
> implement *IDependencyResolver* with *CastleWindsorDependencyResolver*
> class.
>
> *namespace Apache.Ignite.DependencyInjection.CastleWindsor*
> *{*
> *using System;*
> *using Castle.MicroKernel;*
> *using IDependencyResolver =
> Core.DependencyInjection.IDependencyResolver;*
>
> *public class CastleWindsorDependencyResolver : IDependencyResolver*
> *{*
> *private IKernel Kernel { get; set; }*
>
> *public CastleWindsorDependencyResolver(IKernel kernel)*
> *{*
> *Kernel = kernel;*
> *}*
>
> *public T Resolve(object arguments = null)*
> *{*
> *return arguments == null ? Kernel.Resolve() :
> Kernel.Resolve(arguments);*
> *}*
>
> *public object Resolve(Type type, object arguments = null)*
> *{*
> *return arguments == null ? Kernel.Resolve(type) :
> Kernel.Resolve(type, arguments);*
> *}*
> *}*
> *}*
>
> 7. Create extension like this one
>
> namespace Apache.Ignite.DependencyInjection.CastleWindsor
> {
> using Apache.Ignite.Core;
> using Castle.MicroKernel;
>
> public static class IgniteExtensions
> {
> public static IIgnite UseCastleWindsorResolver(this IIgnite ignite,
> IKernel kernel)
> {
> return ignite.SetDependencyResolver(new
> CastleWindsorDependencyResolver(kernel));
> }
> }
> }
>
> 8. Write test.
>
>
> *Usage*
>
> var grid = Ignition.Start();
>
> using (var container = new WindsorContainer())
> {
>
> 

Re: IoC/DI support in Apache Ignite.NEt

2018-09-13 Thread Artyom Sokolov
Hello,

I propose the following.

*Development*

1. Define *IDependencyResolver* in *Apache.Ignite.Core* under
*DependencyInjection* folder that contains at least 2 methods:

*T Resolve(object arguments = null);*
*object Resolve(Type type, object arguments = null);*

2. Create *InjectResolvableAttribute* in Apache.Ignite.Core under
*DependencyInjection* folder marked with
*[AttributeUsage(AttributeTargets.Field
| AttributeTargets.Property)]*
3. Create internal static class *DependencyInjector* with at least one
internal static method that will inject required dependencies in service
implementations like this one (exception checking is omitted currently and
has to be added)

*namespace Apache.Ignite.Core.DependencyInjection*
*{*
*using System.Linq;*
*using System.Reflection;*
*using Apache.Ignite.Core.Services;*

*internal static class DependencyInjector*
*{*
*internal static void Inject(IService svc, IIgnite ignite)*
*{*
*var dependencyResolver = ignite.GetDependencyResolver();*

*if (dependencyResolver == null)*
*{*
*return;*
*}*

*foreach (var property in svc.GetType()*
*.GetProperties(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance))*
*{*
*if
(!property.GetCustomAttributes(typeof(InjectResolvableAttribute),
true).Any())*
*{*
*continue;*
*}*

*if (!property.CanWrite)*
*{*
*continue;*
*}*

*var resolvedDependency =
dependencyResolver.Resolve(property.PropertyType);*
*property.SetValue(svc, resolvedDependency, null);*
*}*

*foreach (var field in svc.GetType()*
*.GetFields(BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance))*
*{*
*if
(!field.GetCustomAttributes(typeof(InjectResolvableAttribute), true).Any())*
*{*
*continue;*
*}*

*var resolvedDependency =
dependencyResolver.Resolve(field.FieldType);*

*field.SetValue(svc, resolvedDependency);*
*}*
*}*
*}*
*}*

4. Add* DependencyInjector.Inject(svc, _ignite);* call to
*UnmanagedCallbacks.cs* right after *ResourceProcessor.Inject(svc, _ignite)*
.
5. Add 2 methods to *Ignite* class and it's interface *IIgnite*:

*public IDependencyResolver GetDependencyResolver();*
*public IIgnite SetDependencyResolver(IDependencyResolver
dependencyResolver);*

6. Create *Apache.Ignite.DependencyInjection.CastleWindsor* project and
implement *IDependencyResolver* with *CastleWindsorDependencyResolver*
class.

*namespace Apache.Ignite.DependencyInjection.CastleWindsor*
*{*
*using System;*
*using Castle.MicroKernel;*
*using IDependencyResolver =
Core.DependencyInjection.IDependencyResolver;*

*public class CastleWindsorDependencyResolver : IDependencyResolver*
*{*
*private IKernel Kernel { get; set; }*

*public CastleWindsorDependencyResolver(IKernel kernel)*
*{*
*Kernel = kernel;*
*}*

*public T Resolve(object arguments = null)*
*{*
*return arguments == null ? Kernel.Resolve() :
Kernel.Resolve(arguments);*
*}*

*public object Resolve(Type type, object arguments = null)*
*{*
*return arguments == null ? Kernel.Resolve(type) :
Kernel.Resolve(type, arguments);*
*}*
*}*
*}*

7. Create extension like this one

namespace Apache.Ignite.DependencyInjection.CastleWindsor
{
using Apache.Ignite.Core;
using Castle.MicroKernel;

public static class IgniteExtensions
{
public static IIgnite UseCastleWindsorResolver(this IIgnite ignite,
IKernel kernel)
{
return ignite.SetDependencyResolver(new
CastleWindsorDependencyResolver(kernel));
}
}
}

8. Write test.


*Usage*

var grid = Ignition.Start();

using (var container = new WindsorContainer())
{
container.Register(Component.For().ImplementedBy());

grid.UseCastleWindsorResolver(container.Kernel);
grid.GetServices().DeployClusterSingleton("FooService", new FooService());
}


What do you think?

Cheers,
Artyom.

On Mon, Sep 10, 2018 at 5:23 PM Pavel Tupitsyn  wrote:

> Hi Artyom,
>
> Ticket already exists: https://issues.apache.org/jira/browse/IGNITE-9299
> Feel free to grab it.
>
> But before diving deep into coding, can you please provide a short overview
> of the proposed implementation?
> Either on dev list or in JIRA ticket directly.
>
> Thanks,
> Pavel
>
> On Mon, Sep 10, 2018 at 11:29 AM Alexey Goncharuk <
> alexey.goncha...@gmail.com> wrote:
>
> > Hello Artyom,
> >
> > Welcome to the Apache Ignite community! I've added you to the list of
> > contributors, you should now be able to assign tickets to yourself.
> >
> > Get familiar with 

Re: IoC/DI support in Apache Ignite.NEt

2018-09-10 Thread Pavel Tupitsyn
Hi Artyom,

Ticket already exists: https://issues.apache.org/jira/browse/IGNITE-9299
Feel free to grab it.

But before diving deep into coding, can you please provide a short overview
of the proposed implementation?
Either on dev list or in JIRA ticket directly.

Thanks,
Pavel

On Mon, Sep 10, 2018 at 11:29 AM Alexey Goncharuk <
alexey.goncha...@gmail.com> wrote:

> Hello Artyom,
>
> Welcome to the Apache Ignite community! I've added you to the list of
> contributors, you should now be able to assign tickets to yourself.
>
> Get familiar with Apache Ignite development process described here:
> https://cwiki.apache.org/confluence/display/IGNITE/Development+Process
>
> Instructions on how to contribute can be found here:
> https://cwiki.apache.org/confluence/display/IGNITE/How+to+Contribute
>
> Project setup in Intellij IDEA:
> https://cwiki.apache.org/confluence/display/IGNITE/Project+Setup
>
> --AG
>
> вс, 9 сент. 2018 г. в 15:20, Artyom Sokolov :
>
> > Hello,
> >
> > I would like to start implementing IoC/DI support (Autofac, Castle
> Windsor,
> > etc.) in Apache Ignite.NET.
> >
> > Please add me as a contributor in JIRA, so I could create ticket and
> start
> > working on this.
> >
> > My JIRA username is applicazza.
> >
> > Cheers,
> > Artyom.
> >
>


Re: IoC/DI support in Apache Ignite.NEt

2018-09-10 Thread Alexey Goncharuk
Hello Artyom,

Welcome to the Apache Ignite community! I've added you to the list of
contributors, you should now be able to assign tickets to yourself.

Get familiar with Apache Ignite development process described here:
https://cwiki.apache.org/confluence/display/IGNITE/Development+Process

Instructions on how to contribute can be found here:
https://cwiki.apache.org/confluence/display/IGNITE/How+to+Contribute

Project setup in Intellij IDEA:
https://cwiki.apache.org/confluence/display/IGNITE/Project+Setup

--AG

вс, 9 сент. 2018 г. в 15:20, Artyom Sokolov :

> Hello,
>
> I would like to start implementing IoC/DI support (Autofac, Castle Windsor,
> etc.) in Apache Ignite.NET.
>
> Please add me as a contributor in JIRA, so I could create ticket and start
> working on this.
>
> My JIRA username is applicazza.
>
> Cheers,
> Artyom.
>


IoC/DI support in Apache Ignite.NEt

2018-09-09 Thread Artyom Sokolov
Hello,

I would like to start implementing IoC/DI support (Autofac, Castle Windsor,
etc.) in Apache Ignite.NET.

Please add me as a contributor in JIRA, so I could create ticket and start
working on this.

My JIRA username is applicazza.

Cheers,
Artyom.