2

困っているので誰か助けてください。

私はこのようなエンティティを持っています:

public class Code
{
    public int ID { get; set; }
    public int UserID { get; set; }
    public string CodeText { get; set; }
}

および次のようなインターフェイス:

public interface ICodeRepository
{
    IQueryable<Code> Codes { get; }
    void AddCode(Code code);
    void RemoveCode(Code code);
    Code GetCodeById(int id);
}

そして、次のようなリポジトリ:

public class SQLCodeRepository : ICodeRepository
{
    private EFSQLContext context;

    public SQLCodeRepository()
    {
        context = new EFSQLContext();
    }

    public IQueryable<Code> Codes
    {
        get { return context.Codes; }
    }

    public void AddCode(Code code)
    {
        context.Codes.Add(code);
        context.SaveChanges();
    }

    public void RemoveCode(Code code)
    {
        context.Codes.Remove(code);
        context.SaveChanges();
    }

    public Code GetCodeById(int id)
    {
        return context.Codes.Where(x => x.ID == id).FirstOrDefault();
    }
}

そして、このようなコンテキスト:

public class EFSQLContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Code> Codes { get; set; }
    public DbSet<PortfolioUser> PortfolioUsers { get; set; }
}

コントローラーを次のように宣言すると:

public class SearchController : Controller
{
    private ICodeRepository cRepo;

    public SearchController(ICodeRepository codeRepository)
    {
        cRepo = codeRepository;
    }
}

そして、cRepo.GetCodeById(1)何も起こらないことを試みます。しかし、プライベートを宣言しICodeRepository rep = new SQLCodeRepositoryてから呼び出すrep.GetCodeById(1)と、リポジトリ内のメソッドが呼び出されていることがわかります。

私は何を間違っていますか?

4

1 に答える 1

3

コンストラクターの署名から、依存関係の注入を行うように見えます。欠けているステップは、Castle Windsor のようなツールを使用して DI コンテナーをセットアップすることです。次に、DI コンテナーを使用するように MVC リゾルバーを構成して、 の正しい実装を提供しますICodeRepository

これを見る

IDependencyResolverを実装するリゾルバとIDependencyScope、継承するコントローラ ファクトリを作成する必要があります。DefaultControllerFactory

それらを取得したら、次のようなことができます。

MyContainer container; // this needs to be a class level member of the asax
var configuration = GlobalConfiguration.Configuration;

container = new MyContainer() // may need additional stuff here depending on DI tool used

configuration.DependencyResolver = new MyDependancyResolver(container);
var mvcControllerFactory = new MyFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(mvcControllerFactory);

上記のコードを asax から呼び出します。Application_Start()

Ninject と MVC3 の使用に関する詳細については、この回答を参照してください。

于 2012-11-06T14:19:57.533 に答える