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

Mugen Injection [WCF]

Начало работы

Для начало работы вам необходимо добавить ссылки на сборки MugenInjection.Core.dll, MugenInjection.Web.dll и MugenInjection.Wcf.dll.
Поддержка WCF включает:
  • IIS hosted сервисы
  • Self-hosted сервисы

Self-Hosted сервисы

Ниже приведен пример веб-сервиса, который имеет зависимость от интерфейса ITimeService.
Описание интерфейса ITimeService и его реализация:
[ServiceContract]
public interface ITimeService
{
    [OperationContract]
    int GetDay();

    [OperationContract]
    DateTime GetUtcTime();
}

public class DefaultTimeService : ITimeService
{
    #region Implementation of ITimeService

    public int GetDay()
    {
        return DateTime.UtcNow.Day;
    }

    public DateTime GetUtcTime()
    {
        return DateTime.UtcNow;
    }

    #endregion
}
В нашем примере интерфейс ITimeService также используется как сервис-контракт:
public class NoLoggingTimeService : ITimeService
{
    #region Fields

    private readonly ITimeService _timeService;

    #endregion

    #region Constructor

    /// <summary>
    /// Initializes a new instance of the <see cref="NoLoggingTimeService"/> class.
    /// </summary>
    public NoLoggingTimeService(ITimeService timeService)
    {
        _timeService = timeService;
    }

    #endregion

    #region Implementation of ITimeService

    public int GetDay()
    {
        return _timeService.GetDay();
    }

    public DateTime GetUtcTime()
    {
        return _timeService.GetUtcTime();
    }

    #endregion
}
Код Windows-сервис приложения для хостинга нашего сервиса:
public class MainService : ServiceBase
{
    #region Fields

    private IInjector _injector;
    private ServiceHost _serviceHost;

    #endregion

    #region Constructor

    /// <summary>
    /// Initializes a new instance of the <see cref="MainService"/> class.
    /// </summary>
    public MainService(IInjector injector)
    {
        _injector = injector;
    }

    #endregion

    #region Static methods

    private static void Main(string[] args)
    {
        var injector = new MugenInjector(new ServiceModule());
        injector.Bind<ITimeService>().To<DefaultTimeService>().InSingletonScope();
        WcfConfigExtension
            .CreateWcfConfiguration(injector)
            .Start();
        var mainService = injector.Get<MainService>();
#if DEBUG
        mainService.OnStart(null);
        Console.Read();
#else
        Run(mainService);
#endif
    }

    #endregion

    #region Overrides of ServiceBase

    protected override void OnStart(string[] args)
    {
        try
        {
            Console.WriteLine("Starting a service...");
            if (_serviceHost != null)
                _serviceHost.Close();
            _serviceHost = WcfConfigExtension.CreateServiceHost(typeof (NoLoggingTimeService));
            _serviceHost.Open();
            Console.WriteLine("Service was started.");
        }
        catch (Exception exception)
        {
            Console.WriteLine("Fatal exception when starting service: {0}", exception);
        }
    }

    protected override void OnStop()
    {
        try
        {
            if (_serviceHost != null)
                _serviceHost.Close();
            if (_injector != null)
            {
                _injector.Dispose();
                _injector = null;
            }                
        }
        catch (Exception exception)
        {
            Console.WriteLine("Fatal exception when stopping service: {0}", exception);
        }
    }

    #endregion
}

IIS Hosted сервисы

Измените global.asax, так чтобы приложение наследовалось от MugenInjectionHttpApplication, а не от HttpApplication. После этого переопределите метод CreateInjector для создание главного контейнера, а также метод Configure для установки конфигурации для WCF приложения.
public class Global : MugenInjectionHttpApplication
{
    #region Overrides of MugenInjectionHttpApplication

    protected override IInjector CreateInjector()
    {
        var injector = new MugenInjector();
        injector.Bind<ITimeService>().To<DefaultTimeService>().InOperationRequestScope();
        return injector;
    }

    protected override void Configure(IApplicationConfiguration applicationConfiguration)
    {
        applicationConfiguration
            .WithHttpConfiguration()
            .WithWcfConfiguration();
    }

    #endregion
}
Далее в файле .svc укажите тип сервиса и тип фабрики для создания сервиса:
<%@ ServiceHost 
    Language="C#" 
    Debug="true" 
    Service="IISHostedService.NoLoggingTimeService" 
    CodeBehind="NoLoggingTimeService.svc.cs"
    Factory="MugenInjection.Wcf.MugenInjectionServiceHostFactory" %>
Код сервиса:
public class NoLoggingTimeService : ITimeService
{
    #region Fields

    private readonly ITimeService _timeService;

    #endregion

    #region Constructor

    public NoLoggingTimeService(ITimeService timeService)
    {
        _timeService = timeService;
    }

    #endregion

    #region Implementation of ITimeService

    public int GetDay()
    {
        return _timeService.GetDay();
    }

    public DateTime GetUtcTime()
    {
        return _timeService.GetUtcTime();
    }

    #endregion
}

Комментарии
Оставить комментарий
*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]