Как использовать ServiceStack Funq в моих собственных проектах

На работе мы делаем несколько новых проектов веб-сервисов в ServiceStack и в некоторых из них используем Funq. В настоящее время я работаю над отдельным проектом, который будет использовать указанные веб-сервисы, и мне было интересно, есть ли способ использовать Funq ServiceStack в моем проекте для разрешения моих зависимостей, чтобы использовать более или менее те же шаблоны, которые мы используем, когда развитие наших веб-сервисов.

Это возможно?

2 ответа

Решение

Я нахожусь в аналогичной ситуации, желая использовать кучу инструментов ServiceStack в не-webby проекте. Я согласен, что есть небольшая нехватка документации для Funq

Я использовал его в устаревшем приложении WinForms, пытаясь избежать изменения исходного проекта (слишком много), и я добавляю новые формы в новый проект.
Я добавил ссылки на большинство библиотек ServiceStack в большинство моих проектов (вручную, потому что я делаю это в.Net 3.5)

Вот код в winforms Program.cs файл; Обратите внимание, что FunqContainer является открытым статическим свойством - я до сих пор не уверен в этом, но он предоставляет доступ через весь проект к FunqContainer

using System;
using System.Threading;
using System.Windows.Forms;

using Funq;
using MyApp.Utilities;

static class Program
    {
        public static Funq.Container FunqContainer { get; set; }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            FunqContainer = new Container();
            FunqContainer.Init(); 

            etc...
        }
    }

FunqContainer.Init() это метод расширения в моем отдельном проекте для - как вы уже догадались - инициализации Funq

using System.Configuration; // Don't forget to ref System.Configuration.dll
using Funq;     
using ServiceStack.OrmLite;
using ServiceStack.OrmLite.SqlServer;

namespace MyApp.Utilities
{
    public static class FunqExtensions
    {
        public static void Init(this Container container)
        {
            //-------------------------------------------------------
            // NB - I don't particularly like AutoWiring the public properties. 
            // Usually I want private stuff in the constructor)
            //-------------------------------------------------------
            var sqlServerConnectionString = ConfigurationManager.ConnectionStrings["HowdyCS"];
            container.Register<IDbConnectionFactory>(
                c => new OrmLiteConnectionFactory(
                    sqlServerConnectionString, 
                    SqlServerOrmLiteDialectProvider.Instance));

            container.Register<SomeForm>(
                c => new SomeForm(
                    c.Resolve<IDbConnectionFactory>()
                )
            ).ReusedWithin(ReuseScope.None);

        }
    }
}

Мне нравится использовать лямду при регистрации - она ​​откладывает построение объектов до их разрешения, а не во время регистрации.
По умолчанию контейнер сохраняет разрешенный объект как одноэлементный, но если у вас есть что-то, что нужно инициализировать каждый раз, когда он используется (например, пользовательские элементы управления или winforms), тогда используйте .ReusedWithin(ReuseScope.None) расширение.

Где мне нужно мое SomeForm (т.е. нажатием кнопки или чем-то еще)

...
private void btnOpenSomeForm_Click(object sender, EventArgs e)
{
    var myForm = Program.FunqContainer.Resolve<SomeForm>();
    myForm.Show();
}

Проверьте http://blogs.clariusconsulting.net/kzu/mab-containermodel-funq-a-transparent-container/ для получения дополнительной информации

Кроме того, это также работает для VB.net, когда вы делаете это через http://converter.telerik.com/

ServiceStack включает в себя расширенную версию Funq (например, с поддержкой AutoWiring), которая содержится в ядре ServiceStack.dll,

К сожалению, в это время ServiceStack.dll содержится в пакете ServiceStack NuGet, который включает другие зависимости сервера ServiceStack. Вы можете собрать его из пакета src или cherry из пакета NuGet только для тех библиотек, которые вам нужны, т.е.

  • ServiceStack.dll
  • ServiceStack.Common.dll
  • ServiceStack.Interfaces.dll
  • ServiceStack.Text.dll
Другие вопросы по тегам