我是Redis的新手(在托管服务中使用它),并希望将其用作列表的演示/沙箱数据存储.
我使用下面的代码.这个对我有用.但是对于一个拥有多个(最多100个)并发用户(对于少量数据 - 最多1000个列表项)的小型网站来说,这是一种有效(而非完全不好的做法)用法吗?
我正在使用静态连接和静态redisclient类型列表,如下所示:
public class MyApp
{
private static ServiceStack.Redis.RedisClient redisClient;
public static IList<Person> Persons;
public static IRedisTypedClient<Person> PersonClient;
static MyApp()
{
redisClient = new RedisClient("nnn.redistogo.com", nnn) { Password = "nnn" };
PersonClient = redisClient.GetTypedClient<Person>();
Persons = PersonClient.Lists["urn:names:current"];
}
}
Run Code Online (Sandbox Code Playgroud)
这样做我有一个非常容易使用的持久数据列表,这正是我在构建/演示应用程序的基本块时所需要的.
foreach (var person in MyApp.Persons) ...
Run Code Online (Sandbox Code Playgroud)
添加新人:
MyApp.Persons.Add(new Person { Id = MyApp.PersonClient.GetNextSequence(), Name = "My Name" });
Run Code Online (Sandbox Code Playgroud)
我担心(目前)不是我在appstart上将完整列表加载到内存中的事实,而是我与redis主机的连接不遵循良好标准的可能性 - 或者是否存在其他问题我不是意识到.
谢谢
环境是Visual Studio 2012,ServiceStack,ASP.NET Web应用程序项目(关注https://github.com/ServiceStack/ServiceStack/wiki/Create-your-first-webservice)
通过查看ServiceStack.Examples中的一些类,我注意到大多数服务只包含一个方法.有些覆盖Execute()或者,如果是REST服务,有些覆盖OnPost/Get/Put/Delete().
我应该如何看待做一个完整的API集,如果我有几我需要实现的功能RegisterUser(),RemoveUser(),AddFriend(),RemoveFriend()...每个方法的一个服务?
public RegisterUserService : IService<User> { public object Execute(User> dto) { ... } }
public RemoveUserService : IService<User> { public object Execute(User> dto) { ... } }
public AddFriendService : IService<Friend> { public object Execute(Friend dto) { ... } }
public RemoveFriendService: IService<RequestDTO4> { public object Execute(Friend dto) { ... } }
Run Code Online (Sandbox Code Playgroud)
我很失落如何开始实现完整的API集.我已经阅读了"创建您的第一个Web服务" 的第一个和第二个 Wiki页面,我已经复制了该服务方法.但现在我想制作10或40种服务方法,我不知道该怎么做.
我注意到,实现from IRestService<T>允许你最多4个方法而不是一个 …
假设有两个存储库接口:
interface IFooRepository
{
void Delete(int id);
}
interface IBarRepository
{
void Delete(int id);
}
Run Code Online (Sandbox Code Playgroud)
和IUnitOfWork接口类似:
interface IUnitOfWork : IDisposable
{
void Commit();
void Rollback();
}
Run Code Online (Sandbox Code Playgroud)
使用ServiceStack.ORMLite实现这些接口的最佳实践是什么,以便用户可以像使用它们一样使用它们
MyFooRepository.Delete(4);
// if an Exception throws here, Bar won't be deleted
MyBarRepository.Delete(7);
Run Code Online (Sandbox Code Playgroud)
要么
using (var uow = CreateUnitOfWork())
{
MyFooRepository.Delete(4);
MyBarRepository.Delete(7);
uow.Commit(); //now they are in an transaction
}
Run Code Online (Sandbox Code Playgroud) 在AppHost上调用Init()时出现上述错误.
这是一个干净的asp.net v 4.5空Web应用程序,它带有一个简单的HelloWorld服务,根据入门教程.
我特意使用安装的旧版ServiceStack:
Install-Package ServiceStack -Version 3.9.71
Run Code Online (Sandbox Code Playgroud)
哪个安装引用:
ServiceStack.dll 3.9.70.0
ServiceStack.Common.dll 3.9.9.0
ServiceStack.Interfaces.dll 3.9.9.0
ServiceStack.OrmLite.dll 3.9.14.0
ServiceStack.OrmLite.SqlServer.dll 1.0.0.0
ServiceStack.Redis.dll 3.9.11.0
ServiceStack.ServiceInterface.dll 3.9.70.0
ServiceStack.Text.dll 4.0.11.0
Run Code Online (Sandbox Code Playgroud)
而我得到的错误是:
[TypeLoadException: Could not load type 'ServiceStack.ServiceHost.IService' from assembly 'ServiceStack.Interfaces, Version=3.9.9.0, Culture=neutral, PublicKeyToken=null'.]
Falck.WebAPI.AppHost..ctor() in c:\inetpub\wwwroot\WebAPI\Falck.WebAPI\Global.asax.cs:17
Falck.WebAPI.Global.Application_Start(Object sender, EventArgs e) in c:\inetpub\wwwroot\WebAPI\Falck.WebAPI\Global.asax.cs:29
[HttpException (0x80004005): Could not load type 'ServiceStack.ServiceHost.IService' from assembly 'ServiceStack.Interfaces, Version=3.9.9.0, Culture=neutral, PublicKeyToken=null'.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +9865825
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +118
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext …Run Code Online (Sandbox Code Playgroud) 我正在创建一个移动应用程序,它需要一个API服务后端来获取/放置每个用户的信息.我将在ServiceStack上开发Web服务,但对存储感到疑惑.我喜欢像Redis这样快速内存缓存系统的想法,但我有几个问题:
根据Service Stack Ormlite文档.我应该在调试模式下生成sql查询.但是,我无法看到这些疑问.简单的代码
private static readonly string DataDirLoc =
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +
"\\TargetIntegration\\Test\\Debug\\";
private readonly string dbFileName = DataDirLoc +
"Test.db3";
[Test]
public void Can_Generate_log() {
//var writer = new TextWriterTraceListener(System.Console.Out);
//Debug.Listeners.Add(writer);
Debug.Write("this is a try");
var dbFact = new OrmLiteConnectionFactory("Data Source={0};Version=3;".FormatParams(dbFileName), true,
SqliteOrmLiteDialectProvider.Instance);
IDbConnection dbConnection = dbFact.OpenDbConnection();
var dbCommand = dbConnection.CreateCommand();
dbCommand.CreateTable<Contact>();
}
Run Code Online (Sandbox Code Playgroud) 我们正在构建一个将使用基本身份验证的ServiceStack API.我目前在AppHost中设置了auth,如下所示:
var authDb = new OrmLiteConnectionFactory("Server=(...);", true, MySqlDialectProvider.Instance);
var authRepo = new OrmLiteAuthRepository(authDb);
authRepo.CreateMissingTables();
container.Register<ICacheClient>(c => new MemoryCacheClient());
container.Register<IUserAuthRepository>(c => authRepo);
Plugins.Add(
new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { new BasicAuthProvider() })
);
Run Code Online (Sandbox Code Playgroud)
当执行没有Authorization标头或错误用户名的请求时+传递响应是重定向到/Account/Login.aspx?ReturnUrl = ...
Parital request + response示例:
POST http://localhost:60278/reserve HTTP/1.1
HTTP/1.1 302 Found
Location: /Account/Login.aspx?ReturnUrl=%2freserve
X-Powered-By: ServiceStack/3,924 Win32NT/.NET
Run Code Online (Sandbox Code Playgroud)
有没有办法让它只响应HTTP 401 Unauthorized或HTTP 403 Forbidden?
我对ServiceStack很新.到目前为止,我已经有幸获得了基本的API和工作(Northwind示例对我特别有帮助).但是,在尝试构建单元和集成测试时,我遇到了绊脚石.
我发现了另一个来自另一个ServiceStack用户的要点,他说明了一些(可能是不正确的)单元和集成测试的例子,但是我无法让那些工作.
这是我一直在使用的参考:https: //github.com/ServiceStack/ServiceStack/issues/435
这是我尝试基本的单元测试,主要使用来自其他用户的要点的借用代码:https: //gist.github.com/anonymous/4957788
当我尝试在HelloWorldTest中运行测试用例时,抛出System.NotImplementedException,声明"无法解析服务'HelloWorldName'".
这让我很困惑,因为我传递了一个请求DTO,而不是一个服务,这似乎与我正在调用的ExecuteService()方法一致.但是,例外情况表明ServiceStack将我的DTO视为一种服务.
有人可能会给我一个很好的,规范的例子,说明如何正确编写ServiceStack的单元和集成测试?我应该提一下,我也是.NET开发的新手,所以也许我的无知正在闪耀.
非常感谢.
目前,我正在使用OrmLite进行数据库操作.我也打算使用Dapper ORM,但任何人都可以指出我如何在ServiceStack中集成DapperORM.我是否需要将Dapper和插件的IDbConnection和IDbConnectionFactory接口实现到容器中.
public override void Configure(Container container) {
container.Register<IDbConnectionFactory>(
c => new OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings["default"].ConnectionString,
SqlServerDialect.Provider));
container.Register<IDbConnection>(c => c.Resolve<IDbConnectionFactory>().OpenDbConnection()).ReusedWithin(ReuseScope.Request);
}
Run Code Online (Sandbox Code Playgroud) F#中的区分联合被编译为抽象类,其选项成为嵌套的具体类.
type DU = A | B
Run Code Online (Sandbox Code Playgroud)
DU是抽象的,而DU.A和DU.B是具体的.
使用ServiceStack,可以使用函数自定义类型到JSON字符串和后面的序列化.关于DU类型,这是我在C#中如何做到的.
using ServiceStack.Text;
JsConfig<DU.A>.SerializeFn = v => "A"; // Func<DU.A, String>
JsConfig<DU.B>.SerializeFn = v => "B"; // Func<DU.B, String>
JsConfig<DU>.DeserializeFn = s =>
if s == "A" then DU.NewA() else DU.NewB(); // Func<String, DU>
Run Code Online (Sandbox Code Playgroud)
F#是否了解其受歧视的工会的编制表格?如何在编译时获得F#中的DU.A类型?
typeof<DU> // compiles
typeof<DU.A> // error FS0039: The type 'A' is not defined
typeof<A> // error FS0039: The type 'A' is not defined
Run Code Online (Sandbox Code Playgroud)
我可以很容易地在F#中注册一个用于反序列化的函数.
open System
open ServiceStack.Text
JsConfig<DU>.RawDeserializeFn <-
Func<_, _>(fun s -> printfn "Hooked"; if …Run Code Online (Sandbox Code Playgroud)