正是这个博客让我感到很困惑:http: //ayende.com/blog/124929/your-ctor-says-that-your-code-is-headache-inducing-explanation
假设我有一个提供访问控制服务的类库.我不想在库本身中使用任何IoC容器来使其易于测试(因此所有内容都被注入,并且没有容器.解析库本身).(WCF服务和使用此库的其他网站将使用一些容器在构造函数中注入依赖项.)
说我的核心类看起来像这样:
public class UserAccessManagement
{
private readonly IUserRepository _repo;
private readonly IHashProvider _hash;
private readonly ITokenEncryptor _tokenEnc;
public UserAccessManagement(IUserRepository repo, IHashProvider hash, ITokenEncryptor tokenEnc)
{
_repo = repo; _hash = hash; _tokenEnc = tokenEnc;
}
public void GrantAccess(string username, string resource)
{
User user = repo.FindUser(username);
new AccessGateKeeper(user.SpnTicket, _hash, _tokenEnc)
.GrantAccess(resource);
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,散列和tokenEnc并非真正被类使用,但必须传递给构造函数,因为在内部它必须将它传递给门控器.出于安全原因,门卫的具体实现必须是内部和密封的类,因此它本身不能被注入构造器,这将解决问题.
所以你最终会通过构造函数注入很多依赖项,尽管它并不一定意味着类本身做得太多了.博客说这太可怕了.在给定三个要求的情况下,是否有更好或更合适的方法来处理这个问题:
我确定之前有人问过这个,但我很难找到.
我正在使用Ninject从我的控制器中删除依赖项,以及存储库设计模式.
据我了解,这种方法的好处之一是,我可以轻松地将我的存储库和域实体分开,并且如果我愿意,可以使用另一个程序集.因此,我将域实体和存储库保存在外部程序集中,并可以从接口模拟我的所有依赖项.
似乎虽然我可以在大多数地方使用接口来引用我的域实体,但在模型绑定方面我必须使用对具体类的引用.我已经读过这与我理解的序列化有关,但是避免引用域实体创建单独模型的唯一方法是什么?
我可以用自定义模型绑定做什么吗?
一点背景:我是一位经验丰富的ASP.net开发人员,但对MVC来说是新手.
asp.net-mvc dependency-injection ninject repository-design custom-model-binder
所以我们在开发CRM环境中有2个Orgs.两个组织都使用相同的工作进程(w3wp.exe).因此,每当一个开发人员在插件中遇到断点时,它就会锁定进程并且两个组织都会停止响应.
我的问题是......是否可以将每个组织放在自己的过程中?
我创建了一个新的ASP.NET Web API项目.然后我使用nuget来拉Ninject.Web.Common,然后从这里下载并构建Ninject.Web.WebApi .包含在项目中.我添加了一个服务和注入通过构造函数,设置绑定(调试器显示代码实际上命中绑定)但仍然抛出此错误:
Error activating IValueService
No matching bindings are available, and the type is not self-bindable.
Activation path:
2) Injection of dependency IValueService into parameter valueService of constructor of type ValuesController
1) Request for ValuesController
Suggestions:
1) Ensure that you have defined a binding for IValueService.
2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
3) Ensure you have not accidentally created more than one kernel. …Run Code Online (Sandbox Code Playgroud) 我曾尝试使用FLINQ,但它与F#3.0测试版相比已经过时了.
有人可以给我一些关于如何在F#中创建动态SQL查询的指针吗?
我正在研究新的ASP.NET Web API作为报告工具.
在SQL中我会这样做:
WHERE order_date
BETWEEN to_date ('2003/01/01', 'yyyy/mm/dd')
AND to_date ('2003/12/31', 'yyyy/mm/dd');
Run Code Online (Sandbox Code Playgroud)
...这些类型的命令如何在ODATA协议URL中转换?
我一直面临着制作一种方法的挑战,该方法将非常大的文本文件读入程序,这些文件的范围可以从2gb到100gb.
到目前为止,这个想法一直是读取方法中的几千行文本.
目前,使用流阅读器设置程序,逐行读取文件并处理在该行上找到的必要数据区域.
using (StreamReader reader = new StreamReader("FileName"))
{
string nextline = reader.ReadLine();
string textline = null;
while (nextline != null)
{
textline = nextline;
Row rw = new Row();
var property = from matchID in xmldata
from matching in matchID.MyProperty
where matchID.ID == textline.Substring(0, 3).TrimEnd()
select matching;
string IDD = textline.Substring(0, 3).TrimEnd();
foreach (var field in property)
{
Field fl = new Field();
fl.Name = field.name;
fl.Data = textline.Substring(field.startByte - 1, field.length).TrimEnd();
fl.Order = order;
fl.Show = true; …Run Code Online (Sandbox Code Playgroud) 我们使用NEventStore(艺术家以前称为Jonathan Oliver的EventStore)来存储我们的CQRS活动.我想知道如果我们希望在Event中添加新属性,是否有必要创建一个新版本的Event.
我知道我们不应该重命名现有属性,因为在从EventStore读取事件时会产生问题.但是,如果我们只添加新属性会产生任何问题吗?
我正在尝试将这段C#转换为F#:
var webClient = new WebClient();
try {
webClient.DownloadString (url);
} catch (WebException e) {
var response = e.Response as HttpWebResponse;
if (response == null)
throw;
using (response) {
using (Stream data = response.GetResponseStream ()) {
string text = new StreamReader (data).ReadToEnd ();
throw new Exception (response.StatusCode + ": " + text);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我现在已经想出了这个,但是它没有编译,因为我显然不能使用let或者use在with块中:
let Download(url: string) =
use webClient = new WebClient ()
try
webClient.DownloadString(url)
with
| :? WebException as ex …Run Code Online (Sandbox Code Playgroud) 我正在测试F#并使用NUnit作为我的测试库; 我发现使用双后退标记允许任意方法命名使我的方法名称更具人性化.
我想知道,无论是正确还是错误,如果可以在使用NUnit TestCaseAttribute更改方法名称时参数化方法名称,例如:
[<TestCase("1", 1)>]
[<TestCase("2", 2)>]
let ``Should return #expected when "#input" is supplied`` input expected =
...
Run Code Online (Sandbox Code Playgroud) c# ×4
f# ×3
ninject ×2
.net ×1
asp.net-mvc ×1
asynchronous ×1
c#-to-f# ×1
constructor ×1
cqrs ×1
nunit ×1
odata ×1
sql ×1
streamreader ×1
versioning ×1