Как использовать 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