2011-03-07 18 views
8

Estoy trabajando en mi primer proyecto de sharepoint. ¿Hay alguna forma de que pueda usar la inyección de dependencia (como Castle Windsor) en sharepoint? Si es así, puede proporcionar un código de samle.Dependency Injection en Sharepoint 2010

Gracias

+0

buena pregunta;) – Rookian

Respuesta

0

Utilizar el Servicio Localizador de SharePoint desde la MS Patrones grupo & Prácticas: http://spg.codeplex.com/

+3

Mientras que la inyección de dependencias y Servicio de Localización tratan de resolver el mismo problema, considero Servicio de localización peligrosa. Ver http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx para más detalles. –

+3

-1 ServiceLocation no es lo mismo que DepdencyInjection (DI). DI significa inyectar una dependencia mientras que la ubicación del servicio es una llamada para obtener una dependencia. Corrígeme si estoy equivocado. – Rookian

+3

¡Absolutamente terrible! No es Inyección de Dependencia –

0

Se puede hacer, como a continuación. Pero esto no es sorprendente porque SharepointClass está instanciado por sharepoint no por el contenedor de inyección de dependencia. Por lo tanto, por ahora, en SharepointClass puede resolver su dependencia como Ioc.Resolve() y las dependencias más profundas de la instancia de IService serán inyectadas por 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>(); 
    } 
} 

Y en su clase de 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(); 
    } 
} 
Cuestiones relacionadas