8 votes

Injection de dépendances dans Sharepoint 2010

Je travaille sur mon premier projet Sharepoint. Y a-t-il un moyen d'utiliser l'injection de dépendance (comme castle windsor) dans sharepoint ? Si oui, pouvez-vous me fournir un exemple de code ?

Merci

0voto

Utilisez le localisateur de services SharePoint du groupe MS Patterns & Practices : http://spg.codeplex.com/

0voto

Mecek Points 590

Vous pouvez faire comme ci-dessous. Mais ce n'est pas génial car SharepointClass est instancié par Sharepoint et non par le conteneur d'injection de dépendance. Donc pour l'instant, dans SharepointClass vous pouvez résoudre votre dépendance comme Ioc.Resolve() et les dépendances plus profondes de l'instance IService seront injectées par Windsor.

public interface IMyCode
{
    void Work();
}

public class MyCode : IMyCode
{
    public void Work()
    {
        Console.WriteLine("working");
    }
}

public interface IService
{
    void DoWork();
}

public class MyService : IService
{
    private readonly IMyCode _myCode;

    public MyService(IMyCode myCode)
    {
        _myCode = myCode;
    }

    public void DoWork()
    {
        Console.WriteLine(GetType().Name + " doing work.");
        _myCode.Work();
    }
}

public class Ioc
{
    private static readonly object Syncroot = new object();
    private readonly IWindsorContainer _container;
    private static Ioc _instance;

    private Ioc()
    {
        _container = new WindsorContainer();
        //register your dependencies here
        _container.Register(Component.For<IMyCode>().ImplementedBy<MyCode>());
        _container.Register(Component.For<IService>().ImplementedBy<MyService>());
    }

    public static Ioc Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (Syncroot)
                {
                    if (_instance == null)
                    {
                        _instance = new Ioc();
                    }
                }
            }
            return _instance;
        }
    }

    public static T Resolve<T>()
    {
        return Instance._container.Resolve<T>();
    }
}

Et dans votre classe sharepoint

public class SharepointClass : SharepointWebpart //instantiated by sharepoint
{
    public IService Service { get { return Ioc.Resolve<IService>(); } }

    public void Operation()
    {
        Console.WriteLine("this is " + GetType().Name);
        Service.DoWork();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X